diff --git a/.env.example b/.env.example index efc6358..c1b8797 100644 --- a/.env.example +++ b/.env.example @@ -4,13 +4,14 @@ # llama-server model names LLAMA_CPP_EMBEDDING_MODEL=embeddinggemma-300m LLAMA_CPP_MODEL= -LLAMA_CPP_MODEL_PATH=models/embeddinggemma-300m-q4_0.gguf + +# Config.json now handles these paths: +# - database.path (default: data/vector.db) +# - model.path (default: models/embeddinggemma-300m-q4_0.gguf) +# See config.json in project root # Embedding dimension (384 for Gemma 3 300M) VEC_DIM=384 # MCP Server port MCP_PORT=3000 - -# Database path -DB_PATH=data/vector.db diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..02e079d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,39 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [0.2.0] - 2026-02-08 + +### Added + +- **Long Text Support**: Automatic chunking and mean pooling for texts exceeding context limits (up to ~20k chars verified). +- **New MCP Tools**: + - `delete_item`: Delete document by ID. + - `get_document`: Get document content by ID. + - `get_vector`: Get vector embedding by ID. + - `list_documents`: List documents with pagination. + - `get_documents_count`: Get total document count. + - `read_recent_items`: Get recently added documents. + - `find_by_vector`: Search using raw vector. +- **UI Enhancements**: + - Real-time sidecar health status in header. + - Connection count and document count display. +- **Connection Stability**: + - SSE Keep-Alive implementation (15s interval). + - Broadcast channel for non-blocking notifications. +- **Distribution**: + - Improved Sidecar path resolution for MSI installers. + - DLL search path fixes for Windows. + +### Changed + +- **Schema**: Renamed `path` column to `document_name` in `items` table. +- **Vector Dimension**: Updated to **768** dimensions (matching Gemma 3 300M). +- **Configuration**: Switched `.copilot/config.json` to use SSE URL (`http://localhost:3000/sse`) instead of stdio. +- **Refactoring**: Split `mcp.rs` into modular structure (`handlers`, `tools`, `types`). + +### Fixed + +- Fixed `llama-server` startup crash in MSI installed environment. +- Fixed `vec0` extension loading issue in `sqlx` connection pool. +- Fixed duplicate header lint errors in documentation. diff --git a/README.md b/README.md index 1cfa59c..1ad965c 100644 --- a/README.md +++ b/README.md @@ -16,19 +16,6 @@ --- -## ✨ 主な機能 - -1. **Tauri v2 + Rust**: 軽量で高速なバックエンド基盤。 -2. **SQLite + sqlite-vec**: リレーショナルデータとベクトルデータの一元管理。 -3. **DBブラウザ (New!)**: テーブル一覧、スキーマ表示、データ閲覧(ページネーション対応)が可能なモダンなGUI。 -4. **MCP 準拠**: SSE プロトコルにより、外部エージェント(Claude 等)からのツール呼び出しに対応。 -5. **Sidecar LLM**: `llama-server` を内蔵し、オフラインでのテキスト処理が可能。 -6. **SeaORM**: 型安全なデータベース操作。 -7. **長文対応**: 入力テキストの自動チャンキングと Mean Pooling により、コンテキスト制限を超える文書もベクトル化可能。 -8. **運用支援**: 詳細なログ記録とステータス可視化。 - ---- - ## 🏗️ システム構造 ```mermaid @@ -51,7 +38,7 @@ end subgraph "Data Layer" - DB[("SQLite + sqlite-vec")] + DB[("SQLite + sqlite-vector")] Model["Gemma 3 300M (GGUF)"] end @@ -67,22 +54,47 @@ --- +## ⚙️ ネイティブモジュール (DLL) について + +Windows 環境での動作安定性のため、ベクトル検索エンジン `sqlite-vector` は独自のビルド構成をとっています。 + +- **`bin/vector.dll`**: ベクトル検索関数を提供。 +- **`bin/sqlite3.dll`**: 拡張機能のシンボル解決に必要な SQLite ライブラリ。 + +実行時にこれらの DLL が正しくロードされるよう、アプリケーションは起動時に `bin/` をプロセスの `PATH` に動的に追加します。詳細は [docs/sqlite-vector-build.md](docs/sqlite-vector-build.md) を参照してください。 + +--- + +## ✨ 主な機能 + +1. **Tauri v2 + Rust**: 軽量で高速なバックエンド基盤。 +2. **SQLite + sqlite-vector**: 仮想テーブル不要。通常のテーブルの `BLOB` カラムにベクトルデータを保存。 +3. **DBブラウザ**: テーブル一覧、スキーマ表示、データ閲覧(ページネーション対応)が可能なモダンなGUI。 +4. **MCP 準拠**: SSE プロトコルにより、外部エージェント(Claude 等)からのツール呼び出しに対応。 +5. **Sidecar LLM**: `llama-server` を内蔵し、オフラインでのテキスト処理が可能。 +6. **SeaORM**: 型安全なデータベース操作。 +7. **長文対応**: 入力テキストの自動チャンキングと Mean Pooling により、コンテキスト制限を超える文書もベクトル化可能。 + +--- + +--- + ## 📁 ディレクトリ構成 ```text . ├── .agent/ # エージェント用ルール・ドキュメント -├── bin/ # 外部バイナリ (llama-server等) +├── bin/ # 外部バイナリ (llama-server, vector.dll等) ├── data/ # データベースファイル (vector.db) ├── docs/ # 仕様・設計ドキュメント ├── journals/ # 開発記録 (Git管理外) ├── logs/ # アプリケーションログ ├── resources/ # アセット類 -├── scripts/ # ユーティリティスクリプト (analyze_nesting, count_lines等) +├── scripts/ # ユーティリティスクリプト ├── src-backend/ # Rust / Tauri バックエンド ├── src-frontend/ # Webview UI ├── tests/ # テストコード -└── tmp/ # 一時ファイル +└── tmp/ # 一時ファイル (ソースビルド用ワークスペース等) ``` --- diff --git a/bin/sqlite3.lib b/bin/sqlite3.lib new file mode 100644 index 0000000..2c96e7b --- /dev/null +++ b/bin/sqlite3.lib Binary files differ diff --git a/bin/sqlite3.pdb b/bin/sqlite3.pdb new file mode 100644 index 0000000..5b04492 --- /dev/null +++ b/bin/sqlite3.pdb Binary files differ diff --git a/bin/vector.dll.bak b/bin/vector.dll.bak new file mode 100644 index 0000000..6d298bc --- /dev/null +++ b/bin/vector.dll.bak Binary files differ diff --git a/build_assets_tmp/config.json b/build_assets_tmp/config.json new file mode 100644 index 0000000..7f21f1c --- /dev/null +++ b/build_assets_tmp/config.json @@ -0,0 +1,11 @@ +{ + "database": { + "path": "data/vector.db" + }, + "model": { + "path": "models/embeddinggemma-300m-q4_0.gguf" + }, + "llama_server": { + "port": 8080 + } +} diff --git a/build_assets_tmp/ggml-base.dll b/build_assets_tmp/ggml-base.dll new file mode 100644 index 0000000..1475207 --- /dev/null +++ b/build_assets_tmp/ggml-base.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-alderlake.dll b/build_assets_tmp/ggml-cpu-alderlake.dll new file mode 100644 index 0000000..4ef0e18 --- /dev/null +++ b/build_assets_tmp/ggml-cpu-alderlake.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-cannonlake.dll b/build_assets_tmp/ggml-cpu-cannonlake.dll new file mode 100644 index 0000000..2f27dff --- /dev/null +++ b/build_assets_tmp/ggml-cpu-cannonlake.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-cascadelake.dll b/build_assets_tmp/ggml-cpu-cascadelake.dll new file mode 100644 index 0000000..4b98908 --- /dev/null +++ b/build_assets_tmp/ggml-cpu-cascadelake.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-cooperlake.dll b/build_assets_tmp/ggml-cpu-cooperlake.dll new file mode 100644 index 0000000..6a97226 --- /dev/null +++ b/build_assets_tmp/ggml-cpu-cooperlake.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-haswell.dll b/build_assets_tmp/ggml-cpu-haswell.dll new file mode 100644 index 0000000..256dca3 --- /dev/null +++ b/build_assets_tmp/ggml-cpu-haswell.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-icelake.dll b/build_assets_tmp/ggml-cpu-icelake.dll new file mode 100644 index 0000000..d21310e --- /dev/null +++ b/build_assets_tmp/ggml-cpu-icelake.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-ivybridge.dll b/build_assets_tmp/ggml-cpu-ivybridge.dll new file mode 100644 index 0000000..90038c7 --- /dev/null +++ b/build_assets_tmp/ggml-cpu-ivybridge.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-piledriver.dll b/build_assets_tmp/ggml-cpu-piledriver.dll new file mode 100644 index 0000000..361740a --- /dev/null +++ b/build_assets_tmp/ggml-cpu-piledriver.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-sandybridge.dll b/build_assets_tmp/ggml-cpu-sandybridge.dll new file mode 100644 index 0000000..00f0c19 --- /dev/null +++ b/build_assets_tmp/ggml-cpu-sandybridge.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-sapphirerapids.dll b/build_assets_tmp/ggml-cpu-sapphirerapids.dll new file mode 100644 index 0000000..ff8ec69 --- /dev/null +++ b/build_assets_tmp/ggml-cpu-sapphirerapids.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-skylakex.dll b/build_assets_tmp/ggml-cpu-skylakex.dll new file mode 100644 index 0000000..53d0089 --- /dev/null +++ b/build_assets_tmp/ggml-cpu-skylakex.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-sse42.dll b/build_assets_tmp/ggml-cpu-sse42.dll new file mode 100644 index 0000000..33b37f5 --- /dev/null +++ b/build_assets_tmp/ggml-cpu-sse42.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-x64.dll b/build_assets_tmp/ggml-cpu-x64.dll new file mode 100644 index 0000000..d8ebe1d --- /dev/null +++ b/build_assets_tmp/ggml-cpu-x64.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu-zen4.dll b/build_assets_tmp/ggml-cpu-zen4.dll new file mode 100644 index 0000000..2c34467 --- /dev/null +++ b/build_assets_tmp/ggml-cpu-zen4.dll Binary files differ diff --git a/build_assets_tmp/ggml-cpu.dll b/build_assets_tmp/ggml-cpu.dll new file mode 100644 index 0000000..2eef116 --- /dev/null +++ b/build_assets_tmp/ggml-cpu.dll Binary files differ diff --git a/build_assets_tmp/ggml-rpc.dll b/build_assets_tmp/ggml-rpc.dll new file mode 100644 index 0000000..3006f11 --- /dev/null +++ b/build_assets_tmp/ggml-rpc.dll Binary files differ diff --git a/build_assets_tmp/ggml-vulkan.dll b/build_assets_tmp/ggml-vulkan.dll new file mode 100644 index 0000000..7433c1a --- /dev/null +++ b/build_assets_tmp/ggml-vulkan.dll Binary files differ diff --git a/build_assets_tmp/ggml.dll b/build_assets_tmp/ggml.dll new file mode 100644 index 0000000..9da7849 --- /dev/null +++ b/build_assets_tmp/ggml.dll Binary files differ diff --git a/build_assets_tmp/icons/128x128.png b/build_assets_tmp/icons/128x128.png new file mode 100644 index 0000000..77e7d23 --- /dev/null +++ b/build_assets_tmp/icons/128x128.png Binary files differ diff --git a/build_assets_tmp/icons/128x128@2x.png b/build_assets_tmp/icons/128x128@2x.png new file mode 100644 index 0000000..0f7976f --- /dev/null +++ b/build_assets_tmp/icons/128x128@2x.png Binary files differ diff --git a/build_assets_tmp/icons/32x32.png b/build_assets_tmp/icons/32x32.png new file mode 100644 index 0000000..98fda06 --- /dev/null +++ b/build_assets_tmp/icons/32x32.png Binary files differ diff --git a/build_assets_tmp/icons/Square107x107Logo.png b/build_assets_tmp/icons/Square107x107Logo.png new file mode 100644 index 0000000..f35d84f --- /dev/null +++ b/build_assets_tmp/icons/Square107x107Logo.png Binary files differ diff --git a/build_assets_tmp/icons/Square142x142Logo.png b/build_assets_tmp/icons/Square142x142Logo.png new file mode 100644 index 0000000..1823bb2 --- /dev/null +++ b/build_assets_tmp/icons/Square142x142Logo.png Binary files differ diff --git a/build_assets_tmp/icons/Square150x150Logo.png b/build_assets_tmp/icons/Square150x150Logo.png new file mode 100644 index 0000000..dc2b22c --- /dev/null +++ b/build_assets_tmp/icons/Square150x150Logo.png Binary files differ diff --git a/build_assets_tmp/icons/Square284x284Logo.png b/build_assets_tmp/icons/Square284x284Logo.png new file mode 100644 index 0000000..0ed3984 --- /dev/null +++ b/build_assets_tmp/icons/Square284x284Logo.png Binary files differ diff --git a/build_assets_tmp/icons/Square30x30Logo.png b/build_assets_tmp/icons/Square30x30Logo.png new file mode 100644 index 0000000..60bf0ea --- /dev/null +++ b/build_assets_tmp/icons/Square30x30Logo.png Binary files differ diff --git a/build_assets_tmp/icons/Square310x310Logo.png b/build_assets_tmp/icons/Square310x310Logo.png new file mode 100644 index 0000000..c8ca0ad --- /dev/null +++ b/build_assets_tmp/icons/Square310x310Logo.png Binary files differ diff --git a/build_assets_tmp/icons/Square44x44Logo.png b/build_assets_tmp/icons/Square44x44Logo.png new file mode 100644 index 0000000..8756459 --- /dev/null +++ b/build_assets_tmp/icons/Square44x44Logo.png Binary files differ diff --git a/build_assets_tmp/icons/Square71x71Logo.png b/build_assets_tmp/icons/Square71x71Logo.png new file mode 100644 index 0000000..2c8023c --- /dev/null +++ b/build_assets_tmp/icons/Square71x71Logo.png Binary files differ diff --git a/build_assets_tmp/icons/Square89x89Logo.png b/build_assets_tmp/icons/Square89x89Logo.png new file mode 100644 index 0000000..2c5e603 --- /dev/null +++ b/build_assets_tmp/icons/Square89x89Logo.png Binary files differ diff --git a/build_assets_tmp/icons/StoreLogo.png b/build_assets_tmp/icons/StoreLogo.png new file mode 100644 index 0000000..17d142c --- /dev/null +++ b/build_assets_tmp/icons/StoreLogo.png Binary files differ diff --git a/build_assets_tmp/icons/icon.icns b/build_assets_tmp/icons/icon.icns new file mode 100644 index 0000000..a2993ad --- /dev/null +++ b/build_assets_tmp/icons/icon.icns Binary files differ diff --git a/build_assets_tmp/icons/icon.ico b/build_assets_tmp/icons/icon.ico new file mode 100644 index 0000000..06c23c8 --- /dev/null +++ b/build_assets_tmp/icons/icon.ico Binary files differ diff --git a/build_assets_tmp/icons/icon.png b/build_assets_tmp/icons/icon.png new file mode 100644 index 0000000..d1756ce --- /dev/null +++ b/build_assets_tmp/icons/icon.png Binary files differ diff --git a/build_assets_tmp/libomp140.x86_64.dll b/build_assets_tmp/libomp140.x86_64.dll new file mode 100644 index 0000000..7c0dd14 --- /dev/null +++ b/build_assets_tmp/libomp140.x86_64.dll Binary files differ diff --git a/build_assets_tmp/llama.dll b/build_assets_tmp/llama.dll new file mode 100644 index 0000000..46a65a9 --- /dev/null +++ b/build_assets_tmp/llama.dll Binary files differ diff --git a/build_assets_tmp/llava_shared.dll b/build_assets_tmp/llava_shared.dll new file mode 100644 index 0000000..583f1f0 --- /dev/null +++ b/build_assets_tmp/llava_shared.dll Binary files differ diff --git a/build_assets_tmp/mtmd.dll b/build_assets_tmp/mtmd.dll new file mode 100644 index 0000000..96dd813 --- /dev/null +++ b/build_assets_tmp/mtmd.dll Binary files differ diff --git a/build_assets_tmp/vector.dll b/build_assets_tmp/vector.dll new file mode 100644 index 0000000..6d298bc --- /dev/null +++ b/build_assets_tmp/vector.dll Binary files differ diff --git a/build_assets_tmp/vector.lib b/build_assets_tmp/vector.lib new file mode 100644 index 0000000..23a500c --- /dev/null +++ b/build_assets_tmp/vector.lib Binary files differ diff --git a/config.json b/config.json new file mode 100644 index 0000000..7f21f1c --- /dev/null +++ b/config.json @@ -0,0 +1,11 @@ +{ + "database": { + "path": "data/vector.db" + }, + "model": { + "path": "models/embeddinggemma-300m-q4_0.gguf" + }, + "llama_server": { + "port": 8080 + } +} diff --git a/distance-avx2.lib b/distance-avx2.lib new file mode 100644 index 0000000..bcc1d83 --- /dev/null +++ b/distance-avx2.lib Binary files differ diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..83769f1 --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,81 @@ +# システムアーキテクチャ概要 + +本システムは、Tauri v2 を基盤とした常駐型デスクトップアプリケーションであり、ローカル LLM (Gemma 3) を活用したベクトル検索バックエンドを提供します。 + +## 全体コンポーネント構成 + +システムは大きく分けて「フロントエンド」「Rust バックエンド」「Sidecar (LLM サーバー)」の3つの層で構成されています。 + +```mermaid +graph TD + subgraph "Frontend Layer (WebView2)" + UI[React / HTML / JS] + end + + subgraph "Rust Backend Layer (Tauri v2)" + Core[Tauri Core] + Axum[Axum SSE / MCP Server] + SeaORM[SeaORM / DB Logic] + LlamaClient[Llama Client / reqwest] + SidecarMgr[Sidecar Process Manager] + end + + subgraph "Sidecar Layer (External Process)" + LS[llama-server.exe] + Model[Gemma 3 300M GGUF] + end + + subgraph "Data Layer" + DB[(SQLite + sqlite-vec)] + end + + UI <-->|Invoke / Events| Core + Core <--> Axum + Core <--> SeaORM + Core <--> LlamaClient + Core <--> SidecarMgr + + Axum <--> DB + SeaORM <--> DB + LlamaClient <-->|HTTP/JSON| LS + SidecarMgr -->|Spawn / Lifecycle| LS + LS -->|Load| Model +``` + +## 各コンポーネントの役割 + +### 1. Frontend Layer + +- **User Interface**: 状態表示、簡易的な検索インターフェースを提供。 +- **IPC通心**: `invoke` を通じて Rust 側のコマンドを呼び出し、システムの状態を取得または操作。 + +### 2. Rust Backend Layer + +- **Tauri Core**: アプリケーションのライフサイクル(起動、システムトレイ常駐、終了)を管理。 +- **Axum (MCP Server)**: Model Context Protocol (MCP) に準拠した SSE サーバーを提供。外部エージェントからのリクエストを受付。 +- **SeaORM**: SQLite データベースへの型安全なアクセス。アイテムのメタデータ管理を担当。 +- **Llama Client**: `llama-server` と通信し、文章のベクトル化 (Embedding) やテキスト生成を依頼。 +- **Sidecar Manager**: `llama-server` プロセスの起動、環境変数パスの解決、DLL 依存関係の処理。 + +### 3. Sidecar Layer + +- **llama-server**: `llama.cpp` の HTTP サーバー版。Gemma 3 アーキテクチャをサポートし、Vulkan によるハードウェア加速を利用。 +- **Gemma 3 300M**: 埋め込み抽出に特化した軽量高精度モデル。 + +### 4. Data Layer + +- **SQLite**: メタデータの保存。 +- **sqlite-vec**: ベクトル演算拡張。`vec0` 仮想テーブルを用いた高速な ANN (Approximate Nearest Neighbor) 検索を提供。 + +## 技術スタックまとめ + +| カテゴリ | 採用技術 | +| :--- | :--- | +| Core Framework | Tauri v2 | +| Language | Rust / JavaScript | +| Database | SQLite (rusqlite) | +| ORM | SeaORM | +| Vector Engine | sqlite-vec (vec0) | +| LLM Engine | llama.cpp (llama-server) | +| MCP Protocol | Axum (SSE) | +| Model | Gemma 3 300M | diff --git a/docs/config_deployment.md b/docs/config_deployment.md new file mode 100644 index 0000000..6adb894 --- /dev/null +++ b/docs/config_deployment.md @@ -0,0 +1,155 @@ +# Config.json 配置戦略 + +## 概要 + +`config.json` は環境に応じて異なる場所に配置されます。アプリケーションは以下の優先順位で設定ファイルを検索します。 + +## 検索優先順位 + +### 1. **AppData/config.json** (最優先) +- **場所**: `%APPDATA%\sqlitevector\config.json` (Windows) +- **用途**: ユーザーがカスタマイズした設定 +- **編集**: ユーザーが自由に編集可能 +- **シナリオ**: 本番インストール後のカスタマイズ + +### 2. **プロジェクトルート/config.json** +- **場所**: `D:\develop\sqlitevector\config.json` +- **用途**: 開発時・テスト時の設定 +- **編集**: 開発者が編集 +- **シナリオ**: + - 開発時: `cargo run`, `bun run dev` + - テスト時: `cargo build --release` + +### 3. **resources/config.json** +- **場所**: バンドル内 `resources/config.json` +- **用途**: 本番アプリのデフォルト設定 +- **編集**: 読み取り専用(バンドルに埋め込まれる) +- **シナリオ**: インストール直後のデフォルト + +### 4. **ハードコードデフォルト** +- 上記すべてが見つからない場合に使用 +- ソースコード内に定義 + +## シナリオ別の動作 + +### 開発中 (`bun run dev`) +``` +実行パス: D:\develop\sqlitevector\target\debug\app.exe +検索順: + 1. %APPDATA%\sqlitevector\config.json (存在しない) + 2. D:\develop\sqlitevector\target\debug\config.json (存在しない) + 3. D:\develop\sqlitevector\target\config.json (存在しない) + 4. D:\develop\sqlitevector\config.json ✓ 発見! +``` + +### リリーステスト (`cargo build --release`) +``` +実行パス: D:\develop\sqlitevector\target\release\app.exe +検索順: + 1. %APPDATA%\sqlitevector\config.json (存在しない) + 2. D:\develop\sqlitevector\target\release\config.json (存在しない) + 3. D:\develop\sqlitevector\target\config.json (存在しない) + 4. D:\develop\sqlitevector\config.json ✓ 発見! +``` + +### 本番インストール後(初回起動) +``` +実行パス: C:\Program Files\sqlitevector\app.exe +検索順: + 1. %APPDATA%\sqlitevector\config.json (存在しない) + 2. C:\Program Files\sqlitevector\config.json (存在しない) + 3. C:\Program Files\sqlitevector\resources\config.json ✓ 発見! +``` + +### 本番インストール後(カスタマイズ後) +``` +実行パス: C:\Program Files\sqlitevector\app.exe +検索順: + 1. %APPDATA%\sqlitevector\config.json ✓ 発見!(ユーザーがコピー・編集) +``` + +## 設定ファイルのカスタマイズ方法 + +### 開発時 +プロジェクトルートの `config.json` を編集: +```bash +cd d:\develop\sqlitevector +notepad config.json +``` + +### 本番インストール後 +1. デフォルト設定をAppDataにコピー: + ```powershell + # Windowsの場合 + $appData = "$env:APPDATA\sqlitevector" + New-Item -ItemType Directory -Path $appData -Force + Copy-Item "C:\Program Files\sqlitevector\resources\config.json" "$appData\config.json" + ``` + +2. コピーした設定を編集: + ```powershell + notepad "$env:APPDATA\sqlitevector\config.json" + ``` + +3. アプリを再起動すると、カスタム設定が読み込まれる + +## config.json の構造 + +```json +{ + "database": { + "path": "data/vector.db" + }, + "model": { + "path": "models/embeddinggemma-300m-q4_0.gguf" + }, + "llama_server": { + "port": 8080 + } +} +``` + +### パスの解釈 + +- **相対パス**: プロジェクトルートからの相対パス(開発時)または実行ファイルからの相対パス(本番時) +- **絶対パス**: そのまま使用 + +例: +```json +{ + "database": { + "path": "D:\\MyData\\vector.db" // 絶対パス + }, + "model": { + "path": "models/mymodel.gguf" // 相対パス + } +} +``` + +## トラブルシューティング + +### 設定が読み込まれない +コンソール出力を確認: +``` +✓ Loaded config from: "D:\\develop\\sqlitevector\\config.json" +``` + +または検索パスのリスト: +``` +⚠ config.json not found. Searched in: + - "C:\\Users\\username\\AppData\\Roaming\\sqlitevector\\config.json" + - "D:\\develop\\sqlitevector\\config.json" + - "C:\\Program Files\\sqlitevector\\resources\\config.json" +Using hardcoded defaults. +``` + +### 設定ファイルの場所を確認 +アプリケーション起動時のログに `Loaded config from:` というメッセージが表示されます。 + +### デフォルトに戻す +AppDataの設定ファイルを削除: +```powershell +Remove-Item "$env:APPDATA\sqlitevector\config.json" +``` + +アプリを再起動すると、バンドルされたデフォルト設定が使用されます。 diff --git a/docs/data_flow.md b/docs/data_flow.md new file mode 100644 index 0000000..e183670 --- /dev/null +++ b/docs/data_flow.md @@ -0,0 +1,69 @@ +# データフロー詳細 + +本システムにおける主要な処理フロー(アイテムの登録とベクトル検索)を詳細に説明します。 + +## 1. アイテム登録フロー (add_item_text) + +ユーザーまたは外部エージェントがテキストを送信してから、ベクトル化されて保存されるまでの流れです。 + +```mermaid +sequenceDiagram + participant Client as MCP Client + participant Axum as MCP Server (Axum) + participant Llama as Llama Client + participant LS as llama-server (Sidecar) + participant DB as SQLite (SeaORM) + + Client->>Axum: Request: tools/call (add_item_text) + Axum->>Llama: get_embedding(content) + Llama->>LS: HTTP POST /embedding + LS->>LS: Gemma 3 Inference (Vectorize) + LS-->>Llama: JSON { embedding: [...] } + Llama-->>Axum: Vec (768dim) + + Axum->>DB: INSERT INTO items (content, path) + DB-->>Axum: Return id + + Axum->>DB: INSERT INTO vec_items (id, embedding) + Note over DB: Binary serialization (Little Endian) + DB-->>Axum: OK + + Axum-->>Client: Result: "Added item with id X" +``` + +## 2. ベクトル検索フロー (search_text) + +クエリ文字列から類似する文章を高速に検索し、返却するまでの流れです。 + +```mermaid +sequenceDiagram + participant Client as MCP Client + participant Axum as MCP Server (Axum) + participant Llama as Llama Client + participant LS as llama-server (Sidecar) + participant DB as SQLite (sqlite-vec) + + Client->>Axum: Request: tools/call (search_text) + Axum->>Llama: get_embedding(query_text) + Llama->>LS: HTTP POST /embedding + LS-->>Llama: Result Vector + Llama-->>Axum: Vec + + Axum->>DB: SELECT ... FROM vec_items ... MATCH ? + Note over DB: Distance Calculation (Cosine / L2) + DB-->>Axum: List of (id, content, distance) + + Axum-->>Client: JSON Format Results +``` + +## 主要なデータ変換 + +### ベクトルシリアライズ + +- `llama-server` から返却されるベクトルは `Vec`(または `f32`)の配列です。 +- `sqlite-vec` で扱うために、Rust 側で `f32` の **Little Endian バイト列 (`Vec`)** に変換して保存/クエリを行います。 + +### MCP 通信 + +- すべての外部インターフェースは MCP (JSON-RPC 2.0) プロトコルに基づきます。 +- 通信トランスポートとして SSE (Server-Sent Events) を使用し、Axum 経由でメッセージをパースします。 diff --git a/docs/database.md b/docs/database.md new file mode 100644 index 0000000..5d4892d --- /dev/null +++ b/docs/database.md @@ -0,0 +1,55 @@ +# データベース設計とベクトル検索仕様 + +本システムは SQLite を、メタデータ管理とベクトル検索エンジンの両方として利用します。 + +## ER図 + +```mermaid +erDiagram + items { + integer id PK "自動インクリメント" + text content "文章本文" + text document_name "ドキュメント名・タイトル等" + datetime created_at "登録日時" + datetime updated_at "更新日時" + blob embedding "768次元ベクトル (f32 LE)" + } +``` + +## テーブル詳細仕様 + +### 1. `items` テーブル (SeaORM 管理) + +アプリケーションの主要なデータを保存します。 + +| カラム名 | 型 | 説明 | +| :--- | :--- | :--- | +| `id` | INTEGER | プライマリキー(自動インクリメント)。 | +| `content` | TEXT | ベクトルの元となったテキストデータ。 | +| `document_name` | TEXT | (オプション)ソースファイルのパスやタイトル。 | +| `created_at` | DATETIME | 作成時刻。 | +| `updated_at` | DATETIME | 更新時刻。 | +| `embedding` | BLOB | ベクトルデータ。`vector_init` で初期化された 768次元の浮動小数点配列。 | + +## ベクトル検索の仕組み + +検索には `vector_quantize_scan` 関数を使用した JOIN を使用します。これにより、インデックスがなくても高速な類似検索が可能です。 + +```sql +SELECT + i.id, + i.content, + v.distance +FROM items i +JOIN vector_quantize_scan('items', 'embedding', ?, 10) AS v ON i.rowid = v.rowid +ORDER BY distance; +``` + +### 距離計算アルゴリズム + +デフォルトでは **L2 距離 (Euclidean distance)** が使用されます。`vector_init` 時にパラメータで変更可能です。 + +## 注意事項 + +- **初期化**: 起動時に `SELECT vector_init(...)` を実行して、BLOBカラムをベクトルとして認識させる必要があります。 +- **次元数**: 使用するモデル (Gemma 3 300M) に合わせて 768 次定数として定義されています。 diff --git a/docs/development_guide.md b/docs/development_guide.md new file mode 100644 index 0000000..de030d8 --- /dev/null +++ b/docs/development_guide.md @@ -0,0 +1,118 @@ +# 💻 開発ガイド (Development Guide) + +本ドキュメントでは、本プロジェクトの開発環境構築、コードの変更、新しいツールの追加、およびテストの手順について解説します。 + +--- + +## 🛠️ 開発環境のセットアップ + +### プログラミング言語・ランタイム + +- **Rust**: [rustup](https://rustup.rs/) を通じて最新の安定版をインストールしてください。 +- **Bun**: フロントエンドの管理と外部テストの実行に使用します。 + +### 依存関係のインストール + +```bash +bun install +``` + +### Sidecar とモデルの準備 + +開発実行には `llama-server` と学習済みモデルが必要です。`scripts/` 内のスクリプトを使用してください。 + +--- + +## 📁 主要なディレクトリ構成と責務 + +- `bin/`: サイドカーバイナリ (`llama-server`) の格納場所。 +- `data/`: データベースファイル (`vector.db`) の永続化レイヤー。 +- `logs/`: 開発・診断用のログ出力。 +- `resources/`: バンドルされる静的リソース(アイコン等)。 +- `src/backend/src/mcp.rs`: MCP の全ツールロジック。 +- `src/backend/src/db.rs`: スキーマ管理。 +- `test/`: 統合テスト一式。 + +--- + +## ➕ 新しい MCP ツールの追加手順 + +新しい機能を MCP ツールとして公開する場合、以下の手順を踏みます。 + +### 1. ツール名の定義 + +`src/backend/src/mcp.rs` 内で、JSON-RPC でやり取りするメソッド名(例: `tools/list`)を確認し、新しいツール用の定義を追加します。 + +### 2. ハンドラーの実装 + +`handle_search_vector` などの既存の関数を参考に、新しい非同期関数を実装します。 + +### 3. リクエストのディスパッチ + +`message_handler` 関数の `match` 文にツール名を追加し、実装したハンドラーを呼び出すように設定します。 + +### 4. 単体テストの追加 + +`src/backend/src/mcp.rs` の末尾にある `mod tests` に、新しいツールの入出力を検証するテストを追加してください。 + +--- + +## 🧪 テストの実行方法 + +### Rust 単体テスト (推奨) + +コアロジック(DB・MCP・LLM連係)のテストです。 + +```bash +cd src/backend +cargo test +``` + +### Bun E2E テスト + +実際の HTTP/SSE 通信を介したテスト(開発環境が整っている場合)。 + +```bash +bun test +``` + +--- + +## 🚀 リリース手順 + +本プロジェクトでは、リリースのポータビリティを確保するため、特定のプラットフォームに依存しない自動化スクリプトを採用しています。 + +### 1. リリースブランチの作成とバージョン更新 + +以下のコマンドを実行すると、新しいリリースブランチ(`release/vX.Y.Z`)が作成され、`package.json`, `tauri.conf.json`, `Cargo.toml` のバージョンが一括更新・コミットされます。 + +```bash +bun run release <新バージョン番号> +# 例: bun run release 0.2.0 +``` + +### 2. インストーラーのビルド + +作成されたリリースブランチで、以下のコマンドを実行して最終的なパッケージ(MSI/EXE)を確認します。 + +```bash +bun run build +``` + +### 3. マージとタグ打ち + +ビルドに問題がなければ、マスターブランチにマージし、タグを打ってリリースを確定させます。 + +```bash +git checkout master +git merge release/v0.2.0 +git tag -a v0.2.0 -m "Release v0.2.0" +``` + +--- + +## 📝 コーディング規約 + +- **Rust**: `cargo fmt` および `cargo clippy` を遵守してください。 +- **Commit**: 分かりやすいメッセージを心がけ、必要に応じてジャーナルファイルを更新してください。 +- **Documentation**: ユーザーに影響する変更を加えた場合は、`README.md` や `document/` 内の該当ドキュメントを必ず更新してください。 diff --git a/docs/directory_structure_analysis.md b/docs/directory_structure_analysis.md new file mode 100644 index 0000000..5c308bc --- /dev/null +++ b/docs/directory_structure_analysis.md @@ -0,0 +1,44 @@ +# Directory Structure Analysis + +## Debug Mode (bun dev) + +- **Root**: `d:\develop\sqlitevector` (Repo Root) +- **Assets**: `d:\develop\sqlitevector\build_assets_tmp\` +- **Execution**: `src-tauri/target/debug/app.exe` is run, but CWD is often `src-tauri` or Repo Root depending on launch config. +- **Sidecar**: `bin/llama-server.exe` (or `build_assets_tmp/llama-server.exe` if prepared) + +## Release Mode (MSI / Bundle) + +Based on `target/release/bundle` structure: + +- **Installation Root**: `%ProgramFiles%\sqlitevector\` +- **Executable**: `sqlitevector.exe` +- **Resources**: `resources\` (Tauri flattens `resources` config here) + - `tauri.conf.json` config: `"resources": ["../../build_assets_tmp/**/*"]` + - **Result**: + - `mcp.json` -> `resources/mcp.json` (Directly under resources) + - `config.json` -> `resources/config.json` + - `models/` -> `resources/models/` + - `vec0.dll`, `llama.dll` -> `resources/vec0.dll`, `resources/llama.dll` +- **Sidecar**: `llama-server-x86_64-pc-windows-msvc.exe` (placed next to main exe or in `resources` depending on `externalBin` usage) + - Current `tauri.conf.json`: `"externalBin": ["../../bin/llama-server"]` + - Tauri places external binaries in the same folder as the main executable, with target triple suffix. + +## The Discrepancy + +- **Code expects**: `resource_dir().join("build_assets_tmp").join("mcp.json")` +- **Actual MSI**: `resource_dir().join("mcp.json")` + +Tauri's `resources` option copies the *contents* of the specified directory if it ends in `/**/*`, or preserves structure otherwise. + +- Configuration: `["../../build_assets_tmp/**/*"]` +- This tells Tauri: "Take everything **inside** `build_assets_tmp` and put it at the root of the app's `resources` folder." + +## Solution + +We must support both structures: + +1. **Debug**: `RepoRoot/build_assets_tmp/mcp.json` +2. **Release**: `App/resources/mcp.json` (Flat) + +We should NOT try to force `build_assets_tmp` folder creation inside `resources` in Release mode, as flattening is standard Tauri behavior for top-level resource inclusion. Instead, `lib.rs` should be smart enough to check both. diff --git a/docs/mcp_specification.md b/docs/mcp_specification.md new file mode 100644 index 0000000..ad9e457 --- /dev/null +++ b/docs/mcp_specification.md @@ -0,0 +1,110 @@ +# MCP ツール詳細仕様 + +本 MCP サーバーが提供するツールの一覧と、その入出力仕様を定義します。 + +## プロトコル基本情報 + +- **トランスポート**: SSE (Server-Sent Events) +- **エンドポイント**: + - SSE Connection: `GET /sse` + - Message Post: `POST /messages` + +## 提供されるツール一覧 + +### 1. `save_document` + +文章をベクトル化してデータベースに登録します。(旧: `add_item_text`) + +- **入力パラメータ**: + - `content` (string, 必須): 登録したい文章本文。 + - `document_name` (string, 必須): ドキュメントの出典やタイトル。 +- **動作**: + 1. Sidecar に Embedding をリクエスト。 + 2. 受け取ったベクトルと文言、ドキュメント名を SQLite に保存。 +- **レスポンス**: 登録成功メッセージと ID。 + +### 2. `find_documents` + +自然言語のクエリを使って、類似度の高いアイテムを検索します。(旧: `search_text`) + +- **入力パラメータ**: + - `content` (string, 必須): 検索クエリ。 + - `limit` (number, 任意): 返却する最高件数(デフォルト 10)。 +- **動作**: + 1. クエリをベクトル化。 + 2. `sqlite-vec` の `MATCH` 句を使用して類似検索。 +- **レスポンス**: 一致したアイテムのリフレッシュリスト(本文、メタデータ、距離値)。 + +### 3. `find_by_vector` + +外部で計算済みのベクトルを直接指定して検索します。(旧: `search_vector`) + +- **入力パラメータ**: + - `vector` (array, 必須): 768次元の数値配列。 + - `limit` (number, 任意): 返却件数(デフォルト 10)。 +- **レスポンス**: 類似度順にソートされたアイテムリスト(`id`, `content`, `document_name`, `created_at`, `updated_at`, `distance`)。 + +### 4. `delete_item` + +指定した ID のアイテムとベクトルを削除します。 + +- **入力パラメータ**: + - `id` (number, 必須): 削除対象のアイテム ID。 +- **レスポンス**: 削除成功メッセージ。 + +### 5. `get_vector` + +指定した ID のアイテムに関連付けられたベクトルを取得します。 + +- **入力パラメータ**: + - `id` (number, 必須): アイテム ID。 +- **レスポンス**: 768次元の数値配列。 + +### 6. `get_document` + +指定した ID の文章本文(メタデータ含む)を取得します。 + +- **入力パラメータ**: + - `id` (number, 必須): アイテム ID。 +- **レスポンス**: ドキュメント詳細(JSON)。 + +### 7. `get_documents_count` + +登録されている全文書の件数を取得します。 + +- **入力パラメータ**: なし。 +- **レスポンス**: 件数(文字列)。 + +### 8. `list_documents` + +文書を ID 昇順(古い順)で一覧取得します。 + +- **入力パラメータ**: + - `limit` (number, 任意): 取得件数 (デフォルト 10)。 + - `offset` (number, 任意): 開始位置 (デフォルト 0)。 +- **レスポンス**: 文書リスト。 + +### 9. `read_recent_items` + +新しく追加された文書から順に取得します。 + +- **入力パラメータ**: + - `limit` (number, 任意): 取得件数 (デフォルト 10)。 +- **レスポンス**: 文書リスト(ID 降順)。 + +### 10. `llm_generate` + +内蔵された Sidecar (Gemma 3) を使用してテキスト生成を行います。 + +- **入力パラメータ**: + - `prompt` (string, 必須): プロンプト本文。 + - `n_predict` (number, 任意): 最大生成トークン数。 + - `temperature` (number, 任意): 生成の多様性 (0.0 - 1.0)。 +- **レスポンス**: 生成されたテキストを含む JSON オブジェクト。 + +## エラーコード仕様 + +MCP 仕様に基づき、問題発生時には以下の JSON-RPC エラーオブジェクトを返却します。 + +- `-32603`: 内部エラー(Sidecar への接続失敗、DBエラー等)。 +- `message`: エラーの具体的な詳細内容。 diff --git a/docs/openapi.yaml b/docs/openapi.yaml new file mode 100644 index 0000000..acbcd7e --- /dev/null +++ b/docs/openapi.yaml @@ -0,0 +1,123 @@ +openapi: 3.0.3 +info: + title: SQLite Vector MCP REST API + version: 0.1.0 + description: | + REST API for text-based insert/search backed by sqlite-vec. + Note: Endpoints are planned and documented here. +servers: + - url: http://localhost:3000 +paths: + /api/items: + post: + summary: Add item from text + description: Generates embeddings from text and stores item + vector. + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + content: + type: string + document_name: + type: string + required: + - content + - document_name + responses: + "200": + description: Item created + content: + application/json: + schema: + type: object + properties: + id: + type: integer + content: + type: string + document_name: + type: string + "400": + description: Invalid request + get: + summary: List documents + description: Returns a list of documents with pagination. + parameters: + - name: limit + in: query + schema: + type: integer + default: 10 + - name: offset + in: query + schema: + type: integer + default: 0 + responses: + "200": + description: A list of items + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Item" + /api/search: + post: + summary: Search by text + description: Generates embeddings from text and returns nearest items. + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + content: + type: string + limit: + type: integer + default: 10 + required: + - content + responses: + "200": + description: Search results + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + type: object + properties: + id: + type: integer + content: + type: string + document_name: + type: string + distance: + type: number + "400": + description: Invalid request +components: + schemas: + Item: + type: object + properties: + id: + type: integer + content: + type: string + document_name: + type: string + created_at: + type: string + updated_at: + type: string diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 0000000..8254c4c --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,86 @@ +# システム詳細概要 (Tauri 2 Edition) + +## 📌 はじめに + +本ドキュメントでは、SQLite Vector MCP Server の内部構造、各コンポーネントの責務、および最新のアーキテクチャに基づいたデータフローについて詳細に解説します。 + +## 🏗️ 主要コンポーネントと役割 + +Tauri v2 への移植に伴い、システムのコアロジックは高性能かつ型安全な Rust 側に集約されました。 + +### 1. Tauri Backend (Rust / `src/backend`) + +| モジュール | 責務 | 使用技術 | +| :--- | :--- | :--- | +| `src/backend/src/lib.rs` | アプリケーションのライフサイクル、Sidecar 起動、システムトレイ制御。 | `tauri`, `tokio` | +| `src/backend/src/mcp.rs` | MCP プロトコル(JSON-RPC / SSE)の実装、ツールハンドリング。 | `axum`, `serde_json` | +| `src/backend/src/db.rs` | データベース接続管理、スキーマ初期化、トリガー設定。 | `sqlx`, `rusqlite` | +| `src/backend/src/entities/` | データベーステーブルの Rust 構造体マッピング。 | `sea-orm` | +| `src/backend/src/llama.rs` | `llama-server` と整合した HTTP 通信、Embedding/Completion 依頼。 | `reqwest` | + +### 2. Sidecar (LLM Server) + +`llama.cpp` プロジェクトの `llama-server` を外部プロセスとして実行します。 + +- **Embedding**: テキストを 384次元(Gemma 3 300M のデフォルト)のベクトルに変換。 +- **Completion**: 指定されたコンテキストに基づくテキスト生成。 + +### 3. Frontend (Webview2) + +ユーザーへの状態通知(Sidecar の稼働状況、ログ出力のモニタリングなど)を行う軽量な UI です。 + +- **Status Hub**: バックエンドからのイベントを受信し、GUI に反映。 + +--- + +## 🔄 詳細なデータフロー + +### 1. 文書の登録 (`add_item_text`) + +```mermaid +sequenceDiagram + participant User as MCP Client + participant Axum as MCP Handler (Axum) + participant Llama as Llama Client + participant Sidecar as llama-server + participant SeaORM as SeaORM / DB + + User->>Axum: Call Tool: add_item_text(content) + Axum->>Llama: generate_embedding(content) + Llama->>Sidecar: POST /embedding + Sidecar-->>Llama: [f32; 384] + Llama-->>Axum: Vector Result + Axum->>SeaORM: Transaction: Insert into items & vec_items + SeaORM-->>Axum: Success (ID) + Axum-->>User: JSON Response (ID, Datetime) +``` + +### 2. 日時管理と自動更新 + +データの一貫性と追跡可能性を確保するため、データベースレベルで以下の処理が行われます。 + +- **INSERT 時**: `created_at`, `updated_at` に `localtime` が自動付与。 +- **UPDATE 時**: トリガーにより `updated_at` が現在の時刻に自動更新。 + +--- + +## 🛠️ 技術スタックの選定理由 + +### なぜ Electron ではなく Tauri なのか? + +1. **ランタイムサイズ**: Node.js を内蔵しないため、インストーラーサイズが 1/10 以下に。 +2. **メモリ効率**: Rust によるメモリ管理により、常駐時のオーバーヘッドを最小化。 +3. **並列処理**: `tokio` ランタイムを活用し、複数の MCP リクエストや Sidecar 管理を非同期で効率的に処理。 + +### なぜ Knex ではなく SeaORM なのか? + +- **型安全**: コンパイル時にクエリの整合性を確認可能。 +- **非同期対応**: Rust の `async/await` にネイティブ対応しており、Tauri との相性が抜群。 + +--- + +## 📈 拡張性と今後の展望 + +1. **マルチベクトル検索**: 異なるモデル(例:画像・テキストのマルチモーダル)への対応。 +2. **全文検索 (FTS5) 統合**: ベクトル検索とキーワード検索を組み合わせたハイブリッド検索の実装。 +3. **リモート LLM 対応**: ローカル Sidecar だけでなく、OpenAI 互換 API へのフォールバック機能。 diff --git a/docs/sidecar_integration.md b/docs/sidecar_integration.md new file mode 100644 index 0000000..a412846 --- /dev/null +++ b/docs/sidecar_integration.md @@ -0,0 +1,78 @@ +# llama-server Sidecar 統合詳細 + +## 🧠 コンセプト + +本アプリケーションは、外部の LLM サーバー(埋め込み用)に依存せず、スタンドアロンで動作することを目指しています。これを実現するために、Tauri の **Sidecar** 機能を利用して `llama-server` プロセスをバックエンド(Rust)から直接起動・管理しています。 + +## 🛠️ 技術的課題と解決策:Windows における DLL 解決 + +Windows 環境において、外部バイナリ(`.exe`)を Sidecar として実行する際、最も大きな懸念点は「依存 DLL(`ggml.dll`, `llama.dll` 等)の読み込みエラー」です。 + +通常、Windows は以下の順序で DLL を検索します。 + +1. 実行ファイルのあるディレクトリ。 +2. カレントディレクトリ。 +3. システムディレクトリ。 +4. `PATH` 環境変数に含まれるディレクトリ。 + +Tauri のデフォルト設定で Sidecar を起動すると、実行ディレクトリやカレントディレクトリの解決が不安定になり、DLL が見つからず起動に失敗するケースが多発します。 + +### 本プロジェクトでの解決アプローチ + +`src-tauri/src/lib.rs` において、以下の 3 つの戦略を組み合わせて「DLL 地獄」を回避しています。 + +#### 1. 実行パスの絶対パス解決 + +`std::env::current_dir()` や `PathBuf` を駆使し、実行バイナリとモデルファイルのパスをOSに依存しない形式で、なおかつ「絶対パス」で構築します。 + +#### 2. 起動時カレントディレクトリ (CWD) の強制指定 + +`Command::current_dir` を使用して、Sidecar の起動ディレクトリを、バイナリと DLL が物理的に配置されている `src-tauri/bin` (またはインストール先の対応フォルダ) に強制的に設定します。これにより、Windows の検索ルール (1) が確実に適用されます。 + +#### 3. 環境変数 `PATH` の継承と補強 + +親プロセス(Tauri 本体)の `PATH` を取得し、その先頭に Sidecar フォルダへのパスを明示的に追加した上で、Sidecar プロセスに渡します。 + +```rust +// 概念コード (lib.rs) +let mut current_path = std::env::var_os("PATH").unwrap_or_default(); +let mut paths = std::env::split_paths(¤t_path).collect::>(); +paths.insert(0, sidecar_dir_path.clone()); // DLLのあるフォルダを最優先に + +let new_path = std::env::join_paths(paths).unwrap(); +let mut cmd = tauri::process::Command::new_sidecar("llama-server").unwrap(); +cmd = cmd.current_dir(sidecar_dir_path); // CWDの設定 +cmd = cmd.env("PATH", new_path); // 補強されたPATHの継承 +``` + +--- + +## 🔄 ライフサイクル管理 + +Sidecar は単なる「起動」だけでなく、適切な「終了」も管理されています。 + +1. **起動**: アプリ本体の `setup` フック内でスピンアップ。 +2. **疎通確認**: 起動直後、バックエンドから `health check` リクエストを送り、準備完了を待機。 +3. **終了**: アプリ本体の終了イベント(トレイからの Quit 等)に連動して、Sidecar プロセスを確実に Kill します。これにより「ゾンビプロセス」の発生を防ぎます。 + +--- + +## ⚙️ Sidecar の実行引数 (最適化) + +`llama-server` は以下のオプションで最適化されて起動します。 + +- `--host 127.0.0.1`: ローカルループバックアドレスに限定(セキュリティ)。 +- `--port 8080`: デフォルトの待機ポート(環境変数で変更可能)。 +- `-m [MODEL_PATH]`: Gemma 3 300M の GGUF ファイルを指定。 +- `--embedding`: 埋め込み抽出機能を有効化。 +- `--parallel 4`: 同時リクエスト処理数の最適化。 + +--- + +## 💡 トラブルシューティング + +### Sidecar が起動しない場合 + +1. **バイナリの存在**: `libs/llama-server.exe` が正しいアーキテクチャ名(`llama-server-x86_64-pc-windows-msvc.exe` 等)で配置されているか確認してください。 +2. **DLL の存在**: 同一フォルダに `ggml.dll`, `llama.dll` が存在することを確認してください。 +3. **Vulkan**: 最新の GPU ドライバがインストールされているか確認してください。 diff --git a/docs/sqlite-vector-build.md b/docs/sqlite-vector-build.md new file mode 100644 index 0000000..20fe608 --- /dev/null +++ b/docs/sqlite-vector-build.md @@ -0,0 +1,62 @@ +# SQLite Vector 拡張機能のビルドと導入 (Windows) + +本システムでは、ベクトル検索エンジンとして [sqliteai/sqlite-vector](https://github.com/sqliteai/sqlite-vector) を利用しています。Windows 環境において標準的なプリビルドバイナリを使用すると依存関係の問題が発生するため、独自のビルド手順を採用しています。 + +## 1. プリビルドバイナリの課題 + +npm パッケージ等で配布されている `vector.dll` は、MinGW 等の外部ランタイム (`libgcc_s_seh-1.dll`) に依存している場合が多く、これらがシステムパスに含まれていないと SQLite からのロードに失敗します。 + +## 2. 解決策:カスタムビルドの採用 + +本プロジェクトでは以下の方法で問題を解決しています。 + +1. **SQLite 本体の DLL 化**: 拡張機能が SQLite のシンボルを解決できるよう、`sqlite3.c` から `sqlite3.dll` を自前でビルド。 +2. **動的リンク**: `vector.dll` をビルドする際、作成した `sqlite3.dll` をリンク対象に指定。 +3. **PATH 環境変数の調整**: アプリケーション起動時に `bin/` フォルダをプロセスの `PATH` に一時的に追加し、依存 DLL を自動検出可能にする。 + +## 3. ビルド手順 + +ビルドには [Zig](https://ziglang.org/) ( `zig cc` ) を使用します。 + +### 手順 A: sqlite3.dll のビルド + +```powershell +zig cc -target x86_64-windows-gnu -shared -O3 "tmp/sqlite-vector/libs/sqlite3.c" -o bin/sqlite3.dll +``` + +### 手順 B: vector.dll のビルド + +ソースコードの修正(AVX2命令の定数初期化回避など)を施した後、以下を実行します。 + +```powershell +$srcFiles = Get-ChildItem -Path "tmp/sqlite-vector/src/*.c" | ForEach-Object { '"' + $_.FullName + '"' } +$cmd = "zig cc -target x86_64-windows-gnu -shared -O3 " + + "-I`"tmp/sqlite-vector/src`" -I`"tmp/sqlite-vector/libs`" -I`"tmp/sqlite-vector/libs/fp16`" " + + ($srcFiles -join ' ') + " `"tmp/sqlite-vector/vector.def`" -Lbin -lsqlite3 -o bin/vector.dll" +Invoke-Expression $cmd +``` + +## 4. 実行時の構造 + +```text +bin/ +├── vector.dll (ベクトル検索拡張) +└── sqlite3.dll (vector.dll が依存するシンボル提供元) +``` + +## 5. プログラムからのロード + +Rust (`src-backend/src/lib.rs`) 内で、以下の処理を行っています。 + +```rust +// bin ディレクトリを PATH に追加 +if let Some(bin_dir) = find_bin_dir() { + let old_path = env::var("PATH").unwrap_or_default(); + env::set_var("PATH", format!("{};{}", bin_dir.display(), old_path)); +} + +// 拡張のロード +conn.load_extension("vector.dll", Some("sqlite3_vector_init")); +``` + +これにより、開発者や利用者は特に追加のランタイムをインストールすることなくシステムを利用可能です。 diff --git a/docs/system_summary.md b/docs/system_summary.md new file mode 100644 index 0000000..8e56264 --- /dev/null +++ b/docs/system_summary.md @@ -0,0 +1,40 @@ +# システム概要 + +本プロジェクトは、SQLite と Rust (Tauri v2) を用いた、ローカル実行型のベクトル検索 MCP (Model Context Protocol) サーバーです。 + +## 主要コンポーネント + +```mermaid +graph LR + User([User / MCP Client]) + + subgraph "App (Tauri v2)" + Axum[Axum SSE Server] + Core[Tauri Core] + DB[(SQLite + sqlite-vec)] + end + + subgraph "Sidecar" + LS[llama-server] + Model[Gemma 3 300M] + end + + User <-->|SSE / JSON-RPC| Axum + Axum <--> DB + Axum <--> LS + LS <--> Model +``` + +## 各コンポーネントの説明 + +- **Tauri v2**: アプリケーションの基盤。Windows 上で常駐し、システムトレイからの操作や UI 表示を提供。 +- **Axum (MCP Server)**: SSE トランスポートを用いた MCP 通信を担当。`messages` ポストを受け、各ツールを実行。 +- **SQLite + sqlite-vec**: ベクトルデータとメタデータを一元管理。`sqlite-vec` による ANN 検索を実行。 +- **llama-server (Sidecar)**: `llama.cpp` の外部プロセス。テキストのベクトル化 (Embedding) および生成を担当。 +- **Gemma 3 300M**: ローカルで高速かつ軽量に埋め込みを抽出するためのモデル。 + +## 開発環境 + +- **言語**: Rust (Backend), Vanilla JS (Frontend) +- **パッケージ管理**: Bun +- **ビルドツール**: Cargo, Tauri CLI diff --git a/document/architecture.md b/document/architecture.md deleted file mode 100644 index 83769f1..0000000 --- a/document/architecture.md +++ /dev/null @@ -1,81 +0,0 @@ -# システムアーキテクチャ概要 - -本システムは、Tauri v2 を基盤とした常駐型デスクトップアプリケーションであり、ローカル LLM (Gemma 3) を活用したベクトル検索バックエンドを提供します。 - -## 全体コンポーネント構成 - -システムは大きく分けて「フロントエンド」「Rust バックエンド」「Sidecar (LLM サーバー)」の3つの層で構成されています。 - -```mermaid -graph TD - subgraph "Frontend Layer (WebView2)" - UI[React / HTML / JS] - end - - subgraph "Rust Backend Layer (Tauri v2)" - Core[Tauri Core] - Axum[Axum SSE / MCP Server] - SeaORM[SeaORM / DB Logic] - LlamaClient[Llama Client / reqwest] - SidecarMgr[Sidecar Process Manager] - end - - subgraph "Sidecar Layer (External Process)" - LS[llama-server.exe] - Model[Gemma 3 300M GGUF] - end - - subgraph "Data Layer" - DB[(SQLite + sqlite-vec)] - end - - UI <-->|Invoke / Events| Core - Core <--> Axum - Core <--> SeaORM - Core <--> LlamaClient - Core <--> SidecarMgr - - Axum <--> DB - SeaORM <--> DB - LlamaClient <-->|HTTP/JSON| LS - SidecarMgr -->|Spawn / Lifecycle| LS - LS -->|Load| Model -``` - -## 各コンポーネントの役割 - -### 1. Frontend Layer - -- **User Interface**: 状態表示、簡易的な検索インターフェースを提供。 -- **IPC通心**: `invoke` を通じて Rust 側のコマンドを呼び出し、システムの状態を取得または操作。 - -### 2. Rust Backend Layer - -- **Tauri Core**: アプリケーションのライフサイクル(起動、システムトレイ常駐、終了)を管理。 -- **Axum (MCP Server)**: Model Context Protocol (MCP) に準拠した SSE サーバーを提供。外部エージェントからのリクエストを受付。 -- **SeaORM**: SQLite データベースへの型安全なアクセス。アイテムのメタデータ管理を担当。 -- **Llama Client**: `llama-server` と通信し、文章のベクトル化 (Embedding) やテキスト生成を依頼。 -- **Sidecar Manager**: `llama-server` プロセスの起動、環境変数パスの解決、DLL 依存関係の処理。 - -### 3. Sidecar Layer - -- **llama-server**: `llama.cpp` の HTTP サーバー版。Gemma 3 アーキテクチャをサポートし、Vulkan によるハードウェア加速を利用。 -- **Gemma 3 300M**: 埋め込み抽出に特化した軽量高精度モデル。 - -### 4. Data Layer - -- **SQLite**: メタデータの保存。 -- **sqlite-vec**: ベクトル演算拡張。`vec0` 仮想テーブルを用いた高速な ANN (Approximate Nearest Neighbor) 検索を提供。 - -## 技術スタックまとめ - -| カテゴリ | 採用技術 | -| :--- | :--- | -| Core Framework | Tauri v2 | -| Language | Rust / JavaScript | -| Database | SQLite (rusqlite) | -| ORM | SeaORM | -| Vector Engine | sqlite-vec (vec0) | -| LLM Engine | llama.cpp (llama-server) | -| MCP Protocol | Axum (SSE) | -| Model | Gemma 3 300M | diff --git a/document/data_flow.md b/document/data_flow.md deleted file mode 100644 index e183670..0000000 --- a/document/data_flow.md +++ /dev/null @@ -1,69 +0,0 @@ -# データフロー詳細 - -本システムにおける主要な処理フロー(アイテムの登録とベクトル検索)を詳細に説明します。 - -## 1. アイテム登録フロー (add_item_text) - -ユーザーまたは外部エージェントがテキストを送信してから、ベクトル化されて保存されるまでの流れです。 - -```mermaid -sequenceDiagram - participant Client as MCP Client - participant Axum as MCP Server (Axum) - participant Llama as Llama Client - participant LS as llama-server (Sidecar) - participant DB as SQLite (SeaORM) - - Client->>Axum: Request: tools/call (add_item_text) - Axum->>Llama: get_embedding(content) - Llama->>LS: HTTP POST /embedding - LS->>LS: Gemma 3 Inference (Vectorize) - LS-->>Llama: JSON { embedding: [...] } - Llama-->>Axum: Vec (768dim) - - Axum->>DB: INSERT INTO items (content, path) - DB-->>Axum: Return id - - Axum->>DB: INSERT INTO vec_items (id, embedding) - Note over DB: Binary serialization (Little Endian) - DB-->>Axum: OK - - Axum-->>Client: Result: "Added item with id X" -``` - -## 2. ベクトル検索フロー (search_text) - -クエリ文字列から類似する文章を高速に検索し、返却するまでの流れです。 - -```mermaid -sequenceDiagram - participant Client as MCP Client - participant Axum as MCP Server (Axum) - participant Llama as Llama Client - participant LS as llama-server (Sidecar) - participant DB as SQLite (sqlite-vec) - - Client->>Axum: Request: tools/call (search_text) - Axum->>Llama: get_embedding(query_text) - Llama->>LS: HTTP POST /embedding - LS-->>Llama: Result Vector - Llama-->>Axum: Vec - - Axum->>DB: SELECT ... FROM vec_items ... MATCH ? - Note over DB: Distance Calculation (Cosine / L2) - DB-->>Axum: List of (id, content, distance) - - Axum-->>Client: JSON Format Results -``` - -## 主要なデータ変換 - -### ベクトルシリアライズ - -- `llama-server` から返却されるベクトルは `Vec`(または `f32`)の配列です。 -- `sqlite-vec` で扱うために、Rust 側で `f32` の **Little Endian バイト列 (`Vec`)** に変換して保存/クエリを行います。 - -### MCP 通信 - -- すべての外部インターフェースは MCP (JSON-RPC 2.0) プロトコルに基づきます。 -- 通信トランスポートとして SSE (Server-Sent Events) を使用し、Axum 経由でメッセージをパースします。 diff --git a/document/database.md b/document/database.md deleted file mode 100644 index 1139046..0000000 --- a/document/database.md +++ /dev/null @@ -1,76 +0,0 @@ -# データベース設計とベクトル検索仕様 - -本システムは SQLite を、メタデータ管理とベクトル検索エンジンの両方として利用します。 - -## ER図 - -```mermaid -erDiagram - items ||--|| vec_items : "id (Primary Key)" - - items { - integer id PK "自動インクリメント" - text content "文章本文" - text path "ファイルのパス等のメタデータ" - datetime created_at "登録日時" - datetime updated_at "更新日時" - } - - vec_items { - integer id PK "items.id と一致" - blob embedding "384次元ベクトル (f32 LE)" - } -``` - -## テーブル詳細仕様 - -### 1. `items` テーブル (SeaORM 管理) - -アプリケーションの主要なデータを保存します。SeaORM によるマイグレーションと型安全な CRUD が可能です。 - -| カラム名 | 型 | 説明 | -| :--- | :--- | :--- | -| `id` | INTEGER | プライマリキー(自動インクリメント)。 | -| `content` | TEXT | ベクトルの元となったテキストデータ。 | -| `path` | TEXT | (オプション)ソースファイルのパスやタイトル。 | -| `created_at` | DATETIME | 作成時刻。SQLite の `datetime('now', 'localtime')`。 | -| `updated_at` | DATETIME | 更新時刻。トリガーにより自動更新。 | - -### 2. `vec_items` 仮想テーブル (sqlite-vec) - -ベクトル検索を高速に行うための仮想テーブルです。`vec0` モジュールを使用します。 - -```sql -CREATE VIRTUAL TABLE vec_items USING vec0( - id INTEGER PRIMARY KEY, - embedding FLOAT[384] -); -``` - -- **id**: `items` テーブルの ID と 1:1 で対応させます。 -- **embedding**: 384次元の浮動小数点配列。内部的には BLOB として保存されます。 - -## ベクトル検索の仕組み - -検索には `MATCH` 句を使用します。これは `sqlite-vec` 特有の構文で、最も類似度の高いアイテムから順に、計算された「距離」とともに返却します。 - -```sql -SELECT - i.id, - i.content, - v.distance -FROM vec_items v -JOIN items i ON v.id = i.id -WHERE embedding MATCH ? -ORDER BY distance -LIMIT 10; -``` - -### 距離計算アルゴリズム - -デフォルトでは **L2 距離 (Euclidean distance)** または検索パラメーターにより **コサイン類似度** が使用されます。本システムの現在の実装では `sqlite-vec` の標準的な `MATCH` を利用しています。 - -## 注意事項 - -- **同期**: `items` への登録と `vec_items` への登録は、アトミックなトランザクションとして扱われます(Rust 側で保証)。 -- **次元数**: 使用するモデル (Gemma 3 300M) に合わせて 384 次定数として定義されています。モデルを変更する場合は、仮想テーブルの再構築が必要です。 diff --git a/document/development_guide.md b/document/development_guide.md deleted file mode 100644 index de030d8..0000000 --- a/document/development_guide.md +++ /dev/null @@ -1,118 +0,0 @@ -# 💻 開発ガイド (Development Guide) - -本ドキュメントでは、本プロジェクトの開発環境構築、コードの変更、新しいツールの追加、およびテストの手順について解説します。 - ---- - -## 🛠️ 開発環境のセットアップ - -### プログラミング言語・ランタイム - -- **Rust**: [rustup](https://rustup.rs/) を通じて最新の安定版をインストールしてください。 -- **Bun**: フロントエンドの管理と外部テストの実行に使用します。 - -### 依存関係のインストール - -```bash -bun install -``` - -### Sidecar とモデルの準備 - -開発実行には `llama-server` と学習済みモデルが必要です。`scripts/` 内のスクリプトを使用してください。 - ---- - -## 📁 主要なディレクトリ構成と責務 - -- `bin/`: サイドカーバイナリ (`llama-server`) の格納場所。 -- `data/`: データベースファイル (`vector.db`) の永続化レイヤー。 -- `logs/`: 開発・診断用のログ出力。 -- `resources/`: バンドルされる静的リソース(アイコン等)。 -- `src/backend/src/mcp.rs`: MCP の全ツールロジック。 -- `src/backend/src/db.rs`: スキーマ管理。 -- `test/`: 統合テスト一式。 - ---- - -## ➕ 新しい MCP ツールの追加手順 - -新しい機能を MCP ツールとして公開する場合、以下の手順を踏みます。 - -### 1. ツール名の定義 - -`src/backend/src/mcp.rs` 内で、JSON-RPC でやり取りするメソッド名(例: `tools/list`)を確認し、新しいツール用の定義を追加します。 - -### 2. ハンドラーの実装 - -`handle_search_vector` などの既存の関数を参考に、新しい非同期関数を実装します。 - -### 3. リクエストのディスパッチ - -`message_handler` 関数の `match` 文にツール名を追加し、実装したハンドラーを呼び出すように設定します。 - -### 4. 単体テストの追加 - -`src/backend/src/mcp.rs` の末尾にある `mod tests` に、新しいツールの入出力を検証するテストを追加してください。 - ---- - -## 🧪 テストの実行方法 - -### Rust 単体テスト (推奨) - -コアロジック(DB・MCP・LLM連係)のテストです。 - -```bash -cd src/backend -cargo test -``` - -### Bun E2E テスト - -実際の HTTP/SSE 通信を介したテスト(開発環境が整っている場合)。 - -```bash -bun test -``` - ---- - -## 🚀 リリース手順 - -本プロジェクトでは、リリースのポータビリティを確保するため、特定のプラットフォームに依存しない自動化スクリプトを採用しています。 - -### 1. リリースブランチの作成とバージョン更新 - -以下のコマンドを実行すると、新しいリリースブランチ(`release/vX.Y.Z`)が作成され、`package.json`, `tauri.conf.json`, `Cargo.toml` のバージョンが一括更新・コミットされます。 - -```bash -bun run release <新バージョン番号> -# 例: bun run release 0.2.0 -``` - -### 2. インストーラーのビルド - -作成されたリリースブランチで、以下のコマンドを実行して最終的なパッケージ(MSI/EXE)を確認します。 - -```bash -bun run build -``` - -### 3. マージとタグ打ち - -ビルドに問題がなければ、マスターブランチにマージし、タグを打ってリリースを確定させます。 - -```bash -git checkout master -git merge release/v0.2.0 -git tag -a v0.2.0 -m "Release v0.2.0" -``` - ---- - -## 📝 コーディング規約 - -- **Rust**: `cargo fmt` および `cargo clippy` を遵守してください。 -- **Commit**: 分かりやすいメッセージを心がけ、必要に応じてジャーナルファイルを更新してください。 -- **Documentation**: ユーザーに影響する変更を加えた場合は、`README.md` や `document/` 内の該当ドキュメントを必ず更新してください。 diff --git a/document/mcp_specification.md b/document/mcp_specification.md deleted file mode 100644 index 4f60f81..0000000 --- a/document/mcp_specification.md +++ /dev/null @@ -1,71 +0,0 @@ -# MCP ツール詳細仕様 - -本 MCP サーバーが提供するツールの一覧と、その入出力仕様を定義します。 - -## プロトコル基本情報 - -- **トランスポート**: SSE (Server-Sent Events) -- **エンドポイント**: - - SSE Connection: `GET /sse` - - Message Post: `POST /messages` - -## 提供されるツール一覧 - -### 1. `add_item_text` - -文章をベクトル化してデータベースに登録します。 - -- **入力パラメータ**: - - `content` (string, 必須): 登録したい文章本文。 - - `path` (string, 任意): ドキュメントの出典やタイトル。 -- **動作**: - 1. Sidecar に Embedding をリクエスト。 - 2. 受け取ったベクトルと文言を SQLite に保存。 -- **レスポンス**: 登録成功メッセージと ID。 - -### 2. `search_text` - -自然言語のクエリを使って、類似度の高いアイテムを検索します。 - -- **入力パラメータ**: - - `content` (string, 必須): 検索クエリ。 - - `limit` (number, 任意): 返却する件数(デフォルト 10)。 -- **動作**: - 1. クエリをベクトル化。 - 2. `sqlite-vec` の `MATCH` 句を使用して類似検索。 -- **レスポンス**: 一致したアイテムのリフレッシュリスト(本文、メタデータ、距離値)。 - -### 3. `search_vector` - -外部で計算済みのベクトルを直接指定して検索します。 - -- **入力パラメータ**: - - `vector` (array, 必須): 384次元の数値配列。 - - `limit` (number, 任意): 返却件数。 -- **レスポンス**: 類似度順にソートされたアイテムリスト(`id`, `content`, `path`, `created_at`, `updated_at`, `distance`)。 - -### 4. `add_item` - -外部で計算済みのベクトルと本文をセットで登録します。 - -- **入力パラメータ**: - - `content` (string, 必須): 本文。 - - `vector` (array, 必須): 384次元ベクトル。 - - `path` (string, 任意): メタデータ。 - -### 5. `llm_generate` - -内蔵された Sidecar (Gemma 3) を使用してテキスト生成を行います。 - -- **入力パラメータ**: - - `prompt` (string, 必須): プロンプト本文。 - - `n_predict` (number, 任意): 最大生成トークン数。 - - `temperature` (number, 任意): 生成の多様性 (0.0 - 1.0)。 -- **レスポンス**: 生成されたテキストを含む JSON オブジェクト。 - -## エラーコード仕様 - -MCP 仕様に基づき、問題発生時には以下の JSON-RPC エラーオブジェクトを返却します。 - -- `-32603`: 内部エラー(Sidecar への接続失敗、DBエラー等)。 -- `message`: エラーの具体的な詳細内容。 diff --git a/document/openapi.yaml b/document/openapi.yaml deleted file mode 100644 index c799e35..0000000 --- a/document/openapi.yaml +++ /dev/null @@ -1,73 +0,0 @@ -openapi: 3.0.3 -info: - title: SQLite Vector MCP REST API - version: 0.1.0 - description: | - REST API for text-based insert/search backed by sqlite-vec. - Note: Endpoints are planned and documented here. -servers: - - url: http://localhost:3000 -paths: - /api/items: - post: - summary: Add item from text - description: Generates embeddings from text and stores item + vector. - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - content: - type: string - required: - - content - responses: - "200": - description: Item created - content: - application/json: - schema: - type: object - properties: - id: - type: integer - content: - type: string - "400": - description: Invalid request - /api/search: - post: - summary: Search by text - description: Generates embeddings from text and returns nearest items. - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - content: - type: string - required: - - content - responses: - "200": - description: Search results - content: - application/json: - schema: - type: object - properties: - results: - type: array - items: - type: object - properties: - content: - type: string - distance: - type: number - "400": - description: Invalid request diff --git a/document/overview.md b/document/overview.md deleted file mode 100644 index 8254c4c..0000000 --- a/document/overview.md +++ /dev/null @@ -1,86 +0,0 @@ -# システム詳細概要 (Tauri 2 Edition) - -## 📌 はじめに - -本ドキュメントでは、SQLite Vector MCP Server の内部構造、各コンポーネントの責務、および最新のアーキテクチャに基づいたデータフローについて詳細に解説します。 - -## 🏗️ 主要コンポーネントと役割 - -Tauri v2 への移植に伴い、システムのコアロジックは高性能かつ型安全な Rust 側に集約されました。 - -### 1. Tauri Backend (Rust / `src/backend`) - -| モジュール | 責務 | 使用技術 | -| :--- | :--- | :--- | -| `src/backend/src/lib.rs` | アプリケーションのライフサイクル、Sidecar 起動、システムトレイ制御。 | `tauri`, `tokio` | -| `src/backend/src/mcp.rs` | MCP プロトコル(JSON-RPC / SSE)の実装、ツールハンドリング。 | `axum`, `serde_json` | -| `src/backend/src/db.rs` | データベース接続管理、スキーマ初期化、トリガー設定。 | `sqlx`, `rusqlite` | -| `src/backend/src/entities/` | データベーステーブルの Rust 構造体マッピング。 | `sea-orm` | -| `src/backend/src/llama.rs` | `llama-server` と整合した HTTP 通信、Embedding/Completion 依頼。 | `reqwest` | - -### 2. Sidecar (LLM Server) - -`llama.cpp` プロジェクトの `llama-server` を外部プロセスとして実行します。 - -- **Embedding**: テキストを 384次元(Gemma 3 300M のデフォルト)のベクトルに変換。 -- **Completion**: 指定されたコンテキストに基づくテキスト生成。 - -### 3. Frontend (Webview2) - -ユーザーへの状態通知(Sidecar の稼働状況、ログ出力のモニタリングなど)を行う軽量な UI です。 - -- **Status Hub**: バックエンドからのイベントを受信し、GUI に反映。 - ---- - -## 🔄 詳細なデータフロー - -### 1. 文書の登録 (`add_item_text`) - -```mermaid -sequenceDiagram - participant User as MCP Client - participant Axum as MCP Handler (Axum) - participant Llama as Llama Client - participant Sidecar as llama-server - participant SeaORM as SeaORM / DB - - User->>Axum: Call Tool: add_item_text(content) - Axum->>Llama: generate_embedding(content) - Llama->>Sidecar: POST /embedding - Sidecar-->>Llama: [f32; 384] - Llama-->>Axum: Vector Result - Axum->>SeaORM: Transaction: Insert into items & vec_items - SeaORM-->>Axum: Success (ID) - Axum-->>User: JSON Response (ID, Datetime) -``` - -### 2. 日時管理と自動更新 - -データの一貫性と追跡可能性を確保するため、データベースレベルで以下の処理が行われます。 - -- **INSERT 時**: `created_at`, `updated_at` に `localtime` が自動付与。 -- **UPDATE 時**: トリガーにより `updated_at` が現在の時刻に自動更新。 - ---- - -## 🛠️ 技術スタックの選定理由 - -### なぜ Electron ではなく Tauri なのか? - -1. **ランタイムサイズ**: Node.js を内蔵しないため、インストーラーサイズが 1/10 以下に。 -2. **メモリ効率**: Rust によるメモリ管理により、常駐時のオーバーヘッドを最小化。 -3. **並列処理**: `tokio` ランタイムを活用し、複数の MCP リクエストや Sidecar 管理を非同期で効率的に処理。 - -### なぜ Knex ではなく SeaORM なのか? - -- **型安全**: コンパイル時にクエリの整合性を確認可能。 -- **非同期対応**: Rust の `async/await` にネイティブ対応しており、Tauri との相性が抜群。 - ---- - -## 📈 拡張性と今後の展望 - -1. **マルチベクトル検索**: 異なるモデル(例:画像・テキストのマルチモーダル)への対応。 -2. **全文検索 (FTS5) 統合**: ベクトル検索とキーワード検索を組み合わせたハイブリッド検索の実装。 -3. **リモート LLM 対応**: ローカル Sidecar だけでなく、OpenAI 互換 API へのフォールバック機能。 diff --git a/document/sidecar_integration.md b/document/sidecar_integration.md deleted file mode 100644 index a412846..0000000 --- a/document/sidecar_integration.md +++ /dev/null @@ -1,78 +0,0 @@ -# llama-server Sidecar 統合詳細 - -## 🧠 コンセプト - -本アプリケーションは、外部の LLM サーバー(埋め込み用)に依存せず、スタンドアロンで動作することを目指しています。これを実現するために、Tauri の **Sidecar** 機能を利用して `llama-server` プロセスをバックエンド(Rust)から直接起動・管理しています。 - -## 🛠️ 技術的課題と解決策:Windows における DLL 解決 - -Windows 環境において、外部バイナリ(`.exe`)を Sidecar として実行する際、最も大きな懸念点は「依存 DLL(`ggml.dll`, `llama.dll` 等)の読み込みエラー」です。 - -通常、Windows は以下の順序で DLL を検索します。 - -1. 実行ファイルのあるディレクトリ。 -2. カレントディレクトリ。 -3. システムディレクトリ。 -4. `PATH` 環境変数に含まれるディレクトリ。 - -Tauri のデフォルト設定で Sidecar を起動すると、実行ディレクトリやカレントディレクトリの解決が不安定になり、DLL が見つからず起動に失敗するケースが多発します。 - -### 本プロジェクトでの解決アプローチ - -`src-tauri/src/lib.rs` において、以下の 3 つの戦略を組み合わせて「DLL 地獄」を回避しています。 - -#### 1. 実行パスの絶対パス解決 - -`std::env::current_dir()` や `PathBuf` を駆使し、実行バイナリとモデルファイルのパスをOSに依存しない形式で、なおかつ「絶対パス」で構築します。 - -#### 2. 起動時カレントディレクトリ (CWD) の強制指定 - -`Command::current_dir` を使用して、Sidecar の起動ディレクトリを、バイナリと DLL が物理的に配置されている `src-tauri/bin` (またはインストール先の対応フォルダ) に強制的に設定します。これにより、Windows の検索ルール (1) が確実に適用されます。 - -#### 3. 環境変数 `PATH` の継承と補強 - -親プロセス(Tauri 本体)の `PATH` を取得し、その先頭に Sidecar フォルダへのパスを明示的に追加した上で、Sidecar プロセスに渡します。 - -```rust -// 概念コード (lib.rs) -let mut current_path = std::env::var_os("PATH").unwrap_or_default(); -let mut paths = std::env::split_paths(¤t_path).collect::>(); -paths.insert(0, sidecar_dir_path.clone()); // DLLのあるフォルダを最優先に - -let new_path = std::env::join_paths(paths).unwrap(); -let mut cmd = tauri::process::Command::new_sidecar("llama-server").unwrap(); -cmd = cmd.current_dir(sidecar_dir_path); // CWDの設定 -cmd = cmd.env("PATH", new_path); // 補強されたPATHの継承 -``` - ---- - -## 🔄 ライフサイクル管理 - -Sidecar は単なる「起動」だけでなく、適切な「終了」も管理されています。 - -1. **起動**: アプリ本体の `setup` フック内でスピンアップ。 -2. **疎通確認**: 起動直後、バックエンドから `health check` リクエストを送り、準備完了を待機。 -3. **終了**: アプリ本体の終了イベント(トレイからの Quit 等)に連動して、Sidecar プロセスを確実に Kill します。これにより「ゾンビプロセス」の発生を防ぎます。 - ---- - -## ⚙️ Sidecar の実行引数 (最適化) - -`llama-server` は以下のオプションで最適化されて起動します。 - -- `--host 127.0.0.1`: ローカルループバックアドレスに限定(セキュリティ)。 -- `--port 8080`: デフォルトの待機ポート(環境変数で変更可能)。 -- `-m [MODEL_PATH]`: Gemma 3 300M の GGUF ファイルを指定。 -- `--embedding`: 埋め込み抽出機能を有効化。 -- `--parallel 4`: 同時リクエスト処理数の最適化。 - ---- - -## 💡 トラブルシューティング - -### Sidecar が起動しない場合 - -1. **バイナリの存在**: `libs/llama-server.exe` が正しいアーキテクチャ名(`llama-server-x86_64-pc-windows-msvc.exe` 等)で配置されているか確認してください。 -2. **DLL の存在**: 同一フォルダに `ggml.dll`, `llama.dll` が存在することを確認してください。 -3. **Vulkan**: 最新の GPU ドライバがインストールされているか確認してください。 diff --git a/document/system_summary.md b/document/system_summary.md deleted file mode 100644 index 8e56264..0000000 --- a/document/system_summary.md +++ /dev/null @@ -1,40 +0,0 @@ -# システム概要 - -本プロジェクトは、SQLite と Rust (Tauri v2) を用いた、ローカル実行型のベクトル検索 MCP (Model Context Protocol) サーバーです。 - -## 主要コンポーネント - -```mermaid -graph LR - User([User / MCP Client]) - - subgraph "App (Tauri v2)" - Axum[Axum SSE Server] - Core[Tauri Core] - DB[(SQLite + sqlite-vec)] - end - - subgraph "Sidecar" - LS[llama-server] - Model[Gemma 3 300M] - end - - User <-->|SSE / JSON-RPC| Axum - Axum <--> DB - Axum <--> LS - LS <--> Model -``` - -## 各コンポーネントの説明 - -- **Tauri v2**: アプリケーションの基盤。Windows 上で常駐し、システムトレイからの操作や UI 表示を提供。 -- **Axum (MCP Server)**: SSE トランスポートを用いた MCP 通信を担当。`messages` ポストを受け、各ツールを実行。 -- **SQLite + sqlite-vec**: ベクトルデータとメタデータを一元管理。`sqlite-vec` による ANN 検索を実行。 -- **llama-server (Sidecar)**: `llama.cpp` の外部プロセス。テキストのベクトル化 (Embedding) および生成を担当。 -- **Gemma 3 300M**: ローカルで高速かつ軽量に埋め込みを抽出するためのモデル。 - -## 開発環境 - -- **言語**: Rust (Backend), Vanilla JS (Frontend) -- **パッケージ管理**: Bun -- **ビルドツール**: Cargo, Tauri CLI diff --git a/dummy.js b/dummy.js deleted file mode 100644 index fbe9c8f..0000000 --- a/dummy.js +++ /dev/null @@ -1,3 +0,0 @@ -// Dummy file for VS Code debugger -// The actual application is launched via preLaunchTask -setInterval(() => {}, 1000); diff --git a/package-lock.json b/package-lock.json index 0990774..626f307 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,19 @@ { - "name": "sqlitevector", - "version": "0.1.1", + "name": "telos-db", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "sqlitevector", - "version": "0.1.1", + "name": "telos-db", + "version": "0.2.0", "license": "ISC", "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", "better-sqlite3": "^12.6.2" }, "devDependencies": { + "@sqliteai/sqlite-vector": "^0.9.85", "@tauri-apps/cli": "^2.10.0", "@types/bun": "latest", "@types/express": "^5.0.6" @@ -71,6 +72,140 @@ } } }, + "node_modules/@sqliteai/sqlite-vector": { + "version": "0.9.85", + "resolved": "https://registry.npmjs.org/@sqliteai/sqlite-vector/-/sqlite-vector-0.9.85.tgz", + "integrity": "sha512-o56NIg10KFutlLWMzKtzMw4kviNk9qUAz+cNFpLSEhP/rtXL8sDMqLbPld3p0Do39LgCtpfi390tWVxKGLUeRQ==", + "dev": true, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "@sqliteai/sqlite-vector-darwin-arm64": "0.9.85", + "@sqliteai/sqlite-vector-darwin-x86_64": "0.9.85", + "@sqliteai/sqlite-vector-linux-arm64": "0.9.85", + "@sqliteai/sqlite-vector-linux-arm64-musl": "0.9.85", + "@sqliteai/sqlite-vector-linux-x86_64": "0.9.85", + "@sqliteai/sqlite-vector-linux-x86_64-musl": "0.9.85", + "@sqliteai/sqlite-vector-win32-x86_64": "0.9.85" + } + }, + "node_modules/@sqliteai/sqlite-vector-darwin-arm64": { + "version": "0.9.85", + "resolved": "https://registry.npmjs.org/@sqliteai/sqlite-vector-darwin-arm64/-/sqlite-vector-darwin-arm64-0.9.85.tgz", + "integrity": "sha512-PAEiOjT2NDbda1VadOsZ7vy66yaWlU2istUsLlyhLhkEDsTbPlu6tWC4dJ/w6QXIAJsjNjGlnhLuBBhJcYmt8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@sqliteai/sqlite-vector-darwin-x86_64": { + "version": "0.9.85", + "resolved": "https://registry.npmjs.org/@sqliteai/sqlite-vector-darwin-x86_64/-/sqlite-vector-darwin-x86_64-0.9.85.tgz", + "integrity": "sha512-ilM1okt/okS0w2WSTrbfZb852bv7avAdatnDrwg3Bp2N+rmpmZH851+nPpZ7yrzUIyrU04OybUuYBl4aEF3PvA==", + "cpu": [ + "x64", + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@sqliteai/sqlite-vector-linux-arm64": { + "version": "0.9.85", + "resolved": "https://registry.npmjs.org/@sqliteai/sqlite-vector-linux-arm64/-/sqlite-vector-linux-arm64-0.9.85.tgz", + "integrity": "sha512-qriqBAtJ6Cpc8/amC668Fr2g7fek74AN4zoq7ACDJZxBI9AGHSqLKv5Vl+DvmocYh5A6R9N9OIpEhb0FxZN/Eg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@sqliteai/sqlite-vector-linux-arm64-musl": { + "version": "0.9.85", + "resolved": "https://registry.npmjs.org/@sqliteai/sqlite-vector-linux-arm64-musl/-/sqlite-vector-linux-arm64-musl-0.9.85.tgz", + "integrity": "sha512-SkhrrCSFGtOt8m3jedyXvUwarFqRug0jqLl+0K9DQNWFdql9hsBs7E89Ck5UeE5vIAxH3TP3nH5mi4v6sIZi5w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@sqliteai/sqlite-vector-linux-x86_64": { + "version": "0.9.85", + "resolved": "https://registry.npmjs.org/@sqliteai/sqlite-vector-linux-x86_64/-/sqlite-vector-linux-x86_64-0.9.85.tgz", + "integrity": "sha512-oKpkKpMbkFpBw2hvGtGXQSbR+W3w1lgtsJmbrHKqXve5zC68UFXECtCVr0iQ8SsA1eg1PreC+acn3xCewGRB3g==", + "cpu": [ + "x64", + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@sqliteai/sqlite-vector-linux-x86_64-musl": { + "version": "0.9.85", + "resolved": "https://registry.npmjs.org/@sqliteai/sqlite-vector-linux-x86_64-musl/-/sqlite-vector-linux-x86_64-musl-0.9.85.tgz", + "integrity": "sha512-dozM35jP5C2TI+V6s5Cr8TERMGst1mqKCDg1In+Q6l5ZIAue7NCQkaHLdsi3cned+PUYXMVl5UrnXmeZ6LtBzw==", + "cpu": [ + "x64", + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@sqliteai/sqlite-vector-win32-x86_64": { + "version": "0.9.85", + "resolved": "https://registry.npmjs.org/@sqliteai/sqlite-vector-win32-x86_64/-/sqlite-vector-win32-x86_64-0.9.85.tgz", + "integrity": "sha512-plFpWeyzOS8TM1m7vPBv6OGKmfyfMjxHpBtpsWO6STo+zI0+JcteAiGXiTOTgj0L7TrRzWuAPLF7qRcsHdq8rQ==", + "cpu": [ + "x64", + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@tauri-apps/cli": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.10.0.tgz", diff --git a/package.json b/package.json index b76a57e..a8b904f 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,15 @@ { - "name": "sqlitevector", - "version": "0.1.1", + "name": "telos-db", + "version": "0.2.0", "description": "Resident MCP server with SQLite vector search, Tauri 2 + Rust runtime, and llama.cpp integration", "type": "module", "repository": { "type": "git", - "url": "https://github.com/yourusername/sqlitevector" + "url": "https://github.com/yourusername/TelosDB" }, - "homepage": "https://github.com/yourusername/sqlitevector", + "homepage": "https://github.com/yourusername/TelosDB", "bugs": { - "url": "https://github.com/yourusername/sqlitevector/issues" + "url": "https://github.com/yourusername/TelosDB/issues" }, "keywords": [ "mcp", @@ -25,15 +25,16 @@ "author": "", "license": "ISC", "scripts": { - "test": "bun test test/**/*.test.js", + "test": "bun test tests/**/*.test.js", "setup": "node scripts/init-env.js && pwsh -File scripts/setup-llama-server-vulkan.ps1 && pwsh -File scripts/setup-model.ps1", - "dev": "node scripts/prepare-resources.cjs && tauri dev --config src/backend/tauri.conf.json", - "build": "node scripts/prepare-resources.cjs && tauri build --config src/backend/tauri.conf.json", + "dev": "node scripts/prepare-resources.cjs && tauri dev --config src-backend/tauri.conf.json", + "build": "node scripts/prepare-resources.cjs && tauri build --config src-backend/tauri.conf.json", "tauri": "tauri", "release": "node scripts/release.js", - "test:watch": "bun test --watch test/**/*.test.js" + "test:watch": "bun test --watch tests/**/*.test.js" }, "devDependencies": { + "@sqliteai/sqlite-vector": "^0.9.85", "@tauri-apps/cli": "^2.10.0", "@types/bun": "latest", "@types/express": "^5.0.6" diff --git a/resources/config.json b/resources/config.json new file mode 100644 index 0000000..7f21f1c --- /dev/null +++ b/resources/config.json @@ -0,0 +1,11 @@ +{ + "database": { + "path": "data/vector.db" + }, + "model": { + "path": "models/embeddinggemma-300m-q4_0.gguf" + }, + "llama_server": { + "port": 8080 + } +} diff --git a/scripts/install-mcp.js b/scripts/install-mcp.js deleted file mode 100644 index a62a4fc..0000000 --- a/scripts/install-mcp.js +++ /dev/null @@ -1,56 +0,0 @@ -import fs from 'fs'; -import os from 'os'; -import path from 'path'; - -/** - * LM Studio 用の MCP プラグインをインストール/セットアップするスクリプト - * 1. プラグインディレクトリの作成 - * 2. 必要なアダプターファイルのコピー - * 3. 対応する設定ファイルの作成 (相対パス使用) - */ - -const PLUGIN_NAME = 'sqlite-vector'; -const PLUGIN_DIR = path.join(os.homedir(), '.lmstudio', 'extensions', 'plugins', 'mcp', PLUGIN_NAME); -const BIN_DIR = path.join(PLUGIN_DIR, 'bin'); - -console.log(`🔧 Setting up LM Studio extension: ${PLUGIN_NAME}...`); - -try { - // 1. ディレクトリ作成 - if (!fs.existsSync(BIN_DIR)) { - fs.mkdirSync(BIN_DIR, { recursive: true }); - console.log(`✅ Created directory: ${BIN_DIR}`); - } - - // 2. アダプターのコピー - const sourceAdapter = path.join(process.cwd(), 'bin', 'mcp-stdio-adapter.cjs'); - const targetAdapter = path.join(BIN_DIR, 'mcp-stdio-adapter.cjs'); - - fs.copyFileSync(sourceAdapter, targetAdapter); - console.log(`✅ Copied adapter to: ${targetAdapter}`); - - // 3. manifest.json の作成/更新 - const manifest = { - "type": "plugin", - "runner": "mcpBridge", - "owner": "mcp", - "name": PLUGIN_NAME - }; - fs.writeFileSync(path.join(PLUGIN_DIR, 'manifest.json'), JSON.stringify(manifest, null, 2)); - console.log('✅ Created manifest.json'); - - // 4. mcp-bridge-config.json の作成 (相対パスを使用しポータブルにする) - const bridgeConfig = { - "command": "node", - "args": ["./bin/mcp-stdio-adapter.cjs"] - }; - fs.writeFileSync(path.join(PLUGIN_DIR, 'mcp-bridge-config.json'), JSON.stringify(bridgeConfig, null, 2)); - console.log('✅ Created mcp-bridge-config.json (using relative path)'); - - console.log(`\n✨ Successfully installed LM Studio extension!`); - console.log(`Please restart LM Studio or reload the plugin.`); - -} catch (err) { - console.error('❌ Failed to install extension:', err.message); - process.exit(1); -} diff --git a/scripts/prepare-resources.cjs b/scripts/prepare-resources.cjs index 5208352..dbdaa64 100644 --- a/scripts/prepare-resources.cjs +++ b/scripts/prepare-resources.cjs @@ -2,7 +2,7 @@ const path = require('path'); const projectRoot = path.resolve(__dirname, '..'); -const backendDir = path.resolve(projectRoot, 'src/backend'); +const backendDir = path.resolve(projectRoot, 'src-backend'); const buildAssetsDir = path.resolve(backendDir, 'build_assets'); function copyRecursiveSync(src, dest) { diff --git a/scripts/test_default_limit.cjs b/scripts/test_default_limit.cjs new file mode 100644 index 0000000..e757128 --- /dev/null +++ b/scripts/test_default_limit.cjs @@ -0,0 +1,93 @@ + +const http = require('http'); + +const MCP_PORT = 3000; + +function sendJsonRpc(method, params) { + return new Promise((resolve, reject) => { + const payload = JSON.stringify({ + jsonrpc: "2.0", + method: "tools/call", + params: { + name: method, + arguments: params + }, + id: Date.now() + }); + + const options = { + hostname: '127.0.0.1', + port: MCP_PORT, + path: '/messages', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(payload) + } + }; + + const req = http.request(options, (res) => { + let body = ''; + res.on('data', chunk => body += chunk); + res.on('end', () => { + if (res.statusCode >= 200 && res.statusCode < 300) { + try { + const json = JSON.parse(body); + if (json.error) reject(json.error); + else resolve(json.result); + } catch (e) { + reject(new Error(`Invalid JSON: ${body}`)); + } + } else { + reject(new Error(`HTTP Error ${res.statusCode}: ${body}`)); + } + }); + }); + + req.on('error', reject); + req.write(payload); + req.end(); + }); +} + +function parseContent(result) { + try { + const text = result.content[0].text; + if (text.startsWith('[') || text.startsWith('{')) { + return JSON.parse(text); + } + return text; + } catch (e) { + return []; + } +} + +async function main() { + try { + console.log("=== Testing Default Limit ==="); + + // We assume there are enough items in DB (US Presidents ~47 + added items > 10) + // Search for something broad like "President" or just "a" + console.log("Searching for 'a' without limit..."); + const res = await sendJsonRpc('find_documents', { + content: "a" + }); + + const items = parseContent(res); + console.log(`Returned ${items.length} items.`); + + if (items.length === 10) { + console.log("SUCCESS: Default limit appears to be 10."); + } else if (items.length > 10) { + console.error("FAILURE: Returned more than 10 items!"); + } else { + console.log("NOTE: Returned fewer than 10 items. Is the DB populated?"); + // We can try to add more items if needed, but existing tests added >40 presidents. + } + + } catch (error) { + console.error("Test Failed:", error); + } +} + +main(); diff --git a/scripts/test_dll.js b/scripts/test_dll.js new file mode 100644 index 0000000..a995e54 --- /dev/null +++ b/scripts/test_dll.js @@ -0,0 +1,46 @@ +import Database from 'better-sqlite3'; +import { join } from 'path'; + +const db = new Database(':memory:'); +const dllPath = join(process.cwd(), 'vector.dll'); + +console.log(`Testing DLL at: ${dllPath}`); + +try { + // Load extension + db.loadExtension(dllPath); + console.log('✅ Success: loadExtension(path)'); + + const version = db.prepare('SELECT vector_version()').get(); + console.log(`Vector Version: ${Object.values(version)[0]}`); + + db.prepare('CREATE TABLE test_items (id INTEGER PRIMARY KEY, embedding BLOB)').run(); + db.prepare("SELECT vector_init('test_items', 'embedding', 'type=FLOAT32,dimension=4')").get(); + console.log('✅ Success: vector_init'); +} catch (err) { + console.error('❌ Failed: loadExtension(path)'); + console.error(err.message); + + try { + // Try without extension + const pathNoExt = dllPath.replace(/\.dll$/, ''); + console.log(`Trying without .dll: ${pathNoExt}`); + db.loadExtension(pathNoExt); + console.log('✅ Success: loadExtension(pathWithoutExt)'); + } catch (err2) { + console.error('❌ Failed: loadExtension(pathWithoutExt)'); + console.error(err2.message); + + try { + // Try with explicit entry point + console.log('Trying with explicit entry point: sqlite3_vector_init'); + db.loadExtension(dllPath, 'sqlite3_vector_init'); + console.log('✅ Success: loadExtension(path, "sqlite3_vector_init")'); + } catch (err3) { + console.error('❌ Failed: loadExtension(path, "sqlite3_vector_init")'); + console.error(err3.message); + } + } +} + +db.close(); diff --git a/scripts/test_load.rs b/scripts/test_load.rs new file mode 100644 index 0000000..814be3d --- /dev/null +++ b/scripts/test_load.rs @@ -0,0 +1,26 @@ +use rusqlite::{Connection, LoadExtensionGuard}; +use std::path::Path; + +fn main() { + let dll_path = "vector.dll"; + println!("Testing with DLL: {}", dll_path); + + let conn = Connection::open_in_memory().expect("Failed to open DB"); + + unsafe { + conn.load_extension_enable().expect("Failed to enable load_extension"); + println!("load_extension enabled"); + + match conn.load_extension(dll_path, Some("sqlite3_vector_init")) { + Ok(_) => println!("✅ Success!"), + Err(e) => { + println!("❌ Failed: {}", e); + // Try without entry point + match conn.load_extension(dll_path, None::<&str>) { + Ok(_) => println!("✅ Success (auto entry point)!"), + Err(e2) => println!("❌ Failed (auto entry point): {}", e2), + } + } + } + } +} diff --git a/scripts/test_long_text.cjs b/scripts/test_long_text.cjs new file mode 100644 index 0000000..ab18132 --- /dev/null +++ b/scripts/test_long_text.cjs @@ -0,0 +1,91 @@ + +const http = require('http'); + +const MCP_PORT = 3000; + +function sendJsonRpc(method, params) { + return new Promise((resolve, reject) => { + const payload = JSON.stringify({ + jsonrpc: "2.0", + method: "tools/call", + params: { + name: method, + arguments: params + }, + id: Date.now() + }); + + const req = http.request({ + hostname: '127.0.0.1', + port: MCP_PORT, + path: '/messages', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(payload) + } + }, (res) => { + let data = ''; + res.on('data', (chunk) => data += chunk); + res.on('end', () => { + if (res.statusCode >= 400) { + reject(new Error(`HTTP ${res.statusCode}: ${data}`)); + } else { + resolve(JSON.parse(data)); + } + }); + }); + + req.on('error', reject); + req.write(payload); + req.end(); + }); +} + +function parseContent(res) { + if (res.error) { + console.error("Test Failed:", res.error); + process.exit(1); + } + return res.result.content[0].text; +} + +async function runTest() { + try { + console.log("=== Testing Long Text Support ==="); + const baseSentence = "This is a long test sentence that will be repeated many times to test the context window and body limit. "; + + for (const repeatCount of [50, 100, 200]) { + const longText = baseSentence.repeat(repeatCount); + console.log(`\n--- Testing with length: ${longText.length} characters ---`); + + // 2. Save Document + console.log(`2. Saving long document (len=${longText.length})...`); + try { + const saveRes = await sendJsonRpc('save_document', { + content: longText, + document_name: `test/long_text_${longText.length}.txt` + }); + const saveMsg = parseContent(saveRes); + console.log(" Result:", saveMsg); + + // 3. Search + console.log("3. Searching for the document..."); + const searchRes = await sendJsonRpc('find_documents', { + content: "long test sentence that will be repeated many times", + limit: 1 + }); + const results = JSON.parse(parseContent(searchRes)); + console.log(` Found ${results.length} results.`); + } catch (err) { + console.error(` Failed for length ${longText.length}:`, err.message); + } + } + + console.log("\n=== Test Complete ==="); + } catch (err) { + console.error("Test Error:", err); + } +} + +runTest(); diff --git a/scripts/test_mcp_features.cjs b/scripts/test_mcp_features.cjs new file mode 100644 index 0000000..c4884a3 --- /dev/null +++ b/scripts/test_mcp_features.cjs @@ -0,0 +1,178 @@ + +const http = require('http'); + +const MCP_PORT = 3000; + +function sendJsonRpc(method, params) { + return new Promise((resolve, reject) => { + const payload = JSON.stringify({ + jsonrpc: "2.0", + method: "tools/call", + params: { + name: method, + arguments: params + }, + id: Date.now() + }); + + const options = { + hostname: '127.0.0.1', + port: MCP_PORT, + path: '/messages', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(payload) + } + }; + + const req = http.request(options, (res) => { + let body = ''; + res.on('data', chunk => body += chunk); + res.on('end', () => { + if (res.statusCode >= 200 && res.statusCode < 300) { + try { + const json = JSON.parse(body); + if (json.error) reject(json.error); + else resolve(json.result); + } catch (e) { + reject(new Error(`Invalid JSON: ${body}`)); + } + } else { + reject(new Error(`HTTP Error ${res.statusCode}: ${body}`)); + } + }); + }); + + req.on('error', reject); + req.write(payload); + req.end(); + }); +} + +function parseContent(result) { + if (!result || !result.content || !result.content[0] || !result.content[0].text) { + return null; + } + try { + const text = result.content[0].text; + // Text might be a plain string or JSON string depending on tool + if (text.startsWith('[') || text.startsWith('{')) { + return JSON.parse(text); + } + return text; + } catch (e) { + return result.content[0].text; + } +} + +async function main() { + try { + console.log("=== Testing MCP Features CRUD ===\n"); + + // 1. Save Document + console.log("1. Saving document: 'The quick brown fox jumps over the lazy dog.'"); + const saveRes = await sendJsonRpc('save_document', { + content: "The quick brown fox jumps over the lazy dog.", + document_name: "test/fox.txt" + }); + const saveMsg = parseContent(saveRes); + console.log(" Result:", saveMsg); + + // Extract ID from message "Saved document with id 123" + const idMatch = saveMsg.match(/id (\d+)/); + if (!idMatch) throw new Error("Could not parse ID from save response"); + const id = parseInt(idMatch[1]); + console.log(" Target ID:", id); + + // 1.5 Get Documents Count + console.log("\n1.5 Getting documents count"); + const countRes = await sendJsonRpc('get_documents_count', {}); + const countMsg = parseContent(countRes); + console.log(" Count:", countMsg); + + // 1.8 List Documents (Oldest First) + console.log("\n1.8 Listing documents (limit=3, offset=0)"); + const listRes = await sendJsonRpc('list_documents', { limit: 3, offset: 0 }); + const listItems = parseContent(listRes); + console.log(" Items returned:", listItems.length); + if (listItems.length > 0) { + console.log(" First item ID:", listItems[0].id); + } + + // 1.9 Read Recent Items (Newest First) + console.log("\n1.9 Reading recent items (limit=3)"); + const recentRes = await sendJsonRpc('read_recent_items', { limit: 3 }); + const recentItems = parseContent(recentRes); + console.log(" Items returned:", recentItems.length); + if (recentItems.length > 0) { + console.log(" First (Newest) item ID:", recentItems[0].id); + } + + // 2. Find Documents + console.log("\n2. Finding documents for 'brown fox'"); + const findRes = await sendJsonRpc('find_documents', { + content: "brown fox", + limit: 1 + }); + const foundDocs = parseContent(findRes); + console.log(" Found:", foundDocs.length, "documents"); + if (foundDocs.length > 0) { + console.log(" Top match ID:", foundDocs[0].id); + console.log(" Top match content:", foundDocs[0].content); + } + + // 3. Get Document + console.log(`\n3. Getting document by ID: ${id}`); + const getDocRes = await sendJsonRpc('get_document', { id: id }); + const docContent = parseContent(getDocRes); + console.log(" Content:", docContent); + if (docContent !== "The quick brown fox jumps over the lazy dog.") { + console.error(" MISMATCH! Expected original content."); + } + + // 4. Get Vector + console.log(`\n4. Getting vector by ID: ${id}`); + const getVecRes = await sendJsonRpc('get_vector', { id: id }); + const vector = parseContent(getVecRes); + console.log(" Vector length:", vector.length); + if (vector.length !== 768) { + console.error(" MISMATCH! Expected 768 dimensions."); + } + + // 5. Find by Vector (using the vector we just got) + console.log("\n5. Finding by vector (using retrieved vector)"); + const findByVecRes = await sendJsonRpc('find_by_vector', { + vector: vector, + limit: 1 + }); + const vecDocs = parseContent(findByVecRes); + console.log(" Found:", vecDocs.length, "documents"); + if (vecDocs.length > 0 && vecDocs[0].id === id) { + console.log(" Success: Retrieved self via vector search."); + } else { + console.error(" Failure: Did not retrieve self."); + } + + // 6. Delete Item + console.log(`\n6. Deleting item ID: ${id}`); + const delRes = await sendJsonRpc('delete_item', { id: id }); + console.log(" Result:", parseContent(delRes)); + + // 7. Verify Deletion + console.log("\n7. Verifying deletion (Get Document)"); + try { + await sendJsonRpc('get_document', { id: id }); + console.error(" ERROR: Item should be gone, but get_document succeeded."); + } catch (e) { + console.log(" Success: get_document failed as expected:", e.message); + } + + console.log("\n=== Test Complete ==="); + + } catch (error) { + console.error("Test Failed:", error); + } +} + +main(); diff --git a/scripts/test_vector_search.cjs b/scripts/test_vector_search.cjs new file mode 100644 index 0000000..8e3fcfe --- /dev/null +++ b/scripts/test_vector_search.cjs @@ -0,0 +1,111 @@ + +const http = require('http'); +const fs = require('fs'); +const path = require('path'); + +const MCP_PORT = 3000; +const PRESIDENTS_FILE = path.join(__dirname, '../document/presidents.md'); + +// Helper to send JSON-RPC requests +function sendJsonRpc(method, params) { + return new Promise((resolve, reject) => { + const payload = JSON.stringify({ + jsonrpc: "2.0", + method: "tools/call", + params: { + name: method, + arguments: params + }, + id: Date.now() + }); + + const options = { + hostname: '127.0.0.1', + port: MCP_PORT, + path: '/messages', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(payload) + } + }; + + const req = http.request(options, (res) => { + let body = ''; + res.on('data', chunk => body += chunk); + res.on('end', () => { + if (res.statusCode >= 200 && res.statusCode < 300) { + try { + const json = JSON.parse(body); + if (json.error) reject(json.error); + else resolve(json.result); + } catch (e) { + reject(new Error(`Invalid JSON: ${body}`)); + } + } else { + reject(new Error(`HTTP Error ${res.statusCode}: ${body}`)); + } + }); + }); + + req.on('error', reject); + req.write(payload); + req.end(); + }); +} + +async function main() { + try { + // 1. Read Presidents File + console.log("Reading presidents.md..."); + const content = fs.readFileSync(PRESIDENTS_FILE, 'utf-8'); + const lines = content.split('\n').filter(line => line.trim().length > 0); + + console.log(`Found ${lines.length} lines. Ingesting...`); + + // 2. Ingest line by line (or chunks) + // For demonstration, we ingest each president as a separate item to allow specific retrieval + for (const line of lines) { + if (line.trim().startsWith('#')) continue; // Skip header + + process.stdout.write(`Adding: ${line.substring(0, 30)}... `); + await sendJsonRpc('save_document', { + content: line.trim(), + document_name: 'document/presidents.md' + }); + console.log("OK"); + } + + console.log("\nIngestion complete. Waiting a moment for DB commit if needed...\n"); + await new Promise(r => setTimeout(r, 1000)); + + // 3. Perform Searches + const queries = [ + "Who was the first president?", + "President during the Civil War", + "President in 2005", + "Lincoln" + ]; + + for (const query of queries) { + console.log(`\nQuery: "${query}"`); + const result = await sendJsonRpc('find_documents', { + content: query, + limit: 3 + }); + + // Parse the inner generic content structure of MCP + const textContent = result.content[0].text; + const items = JSON.parse(textContent); + + items.forEach((item, idx) => { + console.log(` ${idx + 1}. [${item.distance.toFixed(4)}] ${item.content}`); + }); + } + + } catch (error) { + console.error("Error:", error); + } +} + +main(); diff --git a/scripts/verify_llama.cjs b/scripts/verify_llama.cjs new file mode 100644 index 0000000..0a5eb88 --- /dev/null +++ b/scripts/verify_llama.cjs @@ -0,0 +1,71 @@ + +const http = require('http'); + +const options = { + hostname: '127.0.0.1', + port: 8080, + path: '/health', + method: 'GET', +}; + +const req = http.request(options, (res) => { + console.log(`STATUS: ${res.statusCode}`); + res.on('data', (chunk) => { + console.log(`BODY: ${chunk}`); + }); +}); + +req.on('error', (e) => { + console.error(`problem with request: ${e.message}`); +}); + +req.end(); + +const embeddingOptions = { + hostname: '127.0.0.1', + port: 8080, + path: '/embeddings', + method: 'POST', + headers: { + 'Content-Type': 'application/json' + } +}; + +const embeddingReq = http.request(embeddingOptions, (res) => { + console.log(`EMBEDDING (root) STATUS: ${res.statusCode}`); + let body = ''; + res.on('data', (chunk) => body += chunk); + res.on('end', () => console.log(`EMBEDDING (root) BODY: ${body}`)); +}); + +embeddingReq.on('error', (e) => { + console.error(`embedding problem: ${e.message}`); +}); + +embeddingReq.write(JSON.stringify({ + content: "test", + model: "ignored" +})); +embeddingReq.end(); + +const v1Options = { + hostname: '127.0.0.1', + port: 8080, + path: '/v1/embeddings', + method: 'POST', + headers: { 'Content-Type': 'application/json' } +}; + +const v1Req = http.request(v1Options, (res) => { + console.log(`EMBEDDING (v1) STATUS: ${res.statusCode}`); + let body = ''; + res.on('data', (chunk) => body += chunk); + res.on('end', () => console.log(`EMBEDDING (v1) BODY: ${body}`)); +}); + +v1Req.on('error', (e) => console.error(e)); +v1Req.write(JSON.stringify({ + input: "test", + model: "ignored" +})); +v1Req.end(); diff --git a/scripts/verify_mcp_tool.cjs b/scripts/verify_mcp_tool.cjs new file mode 100644 index 0000000..16d2cd0 --- /dev/null +++ b/scripts/verify_mcp_tool.cjs @@ -0,0 +1,40 @@ + +const http = require('http'); + +const payload = JSON.stringify({ + jsonrpc: "2.0", + method: "tools/call", + params: { + name: "add_item_text", + arguments: { + content: "Test Entry from Verify Script", + path: "verify_script.txt" + } + }, + id: 123 +}); + +const options = { + hostname: '127.0.0.1', + port: 3000, + path: '/messages', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': payload.length + } +}; + +const req = http.request(options, (res) => { + console.log(`STATUS: ${res.statusCode}`); + res.on('data', (chunk) => { + console.log(`BODY: ${chunk}`); + }); +}); + +req.on('error', (e) => { + console.error(`problem with request: ${e.message}`); +}); + +req.write(payload); +req.end(); diff --git a/src-backend/Cargo.lock b/src-backend/Cargo.lock new file mode 100644 index 0000000..eedda4e --- /dev/null +++ b/src-backend/Cargo.lock @@ -0,0 +1,6691 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_log-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" + +[[package]] +name = "android_logger" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3" +dependencies = [ + "android_log-sys", + "env_filter", + "log", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "assert-json-diff" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[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 = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bigdecimal" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695" +dependencies = [ + "autocfg", + "libm", + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[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 = "borsh" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +dependencies = [ + "once_cell", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "byte-unit" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6d47a4e2961fb8721bcfc54feae6455f2f64e7054f9bc67e875f0e77f4c58d" +dependencies = [ + "rust_decimal", + "schemars 1.2.1", + "serde", + "utf8-width", +] + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +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.10.0", + "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +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.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.11+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" +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.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "colored" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[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.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.10.1", + "core-graphics-types", + "foreign-types 0.5.0", + "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.10.0", + "core-foundation 0.10.1", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[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.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.114", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.114", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.114", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.114", +] + +[[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.114", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +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 = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[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.114", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[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 = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + +[[package]] +name = "embed-resource" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.11+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.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_filter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "fern" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29" +dependencies = [ + "log", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[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 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[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 = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[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.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[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", + "wasip2", +] + +[[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.10.0", + "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.114", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[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.114", +] + +[[package]] +name = "h2" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[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 = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever", + "match_token", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +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 = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[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 0.62.2", +] + +[[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.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +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.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "inherent" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c727f80bfa4a6c6e2508d2f05b6f4bfce242030bd88ed15ae5331c5b5d30fba7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + +[[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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[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 = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.10.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser", + "html5ever", + "indexmap 2.13.0", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[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.180" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" + +[[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 = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags 2.10.0", + "libc", + "redox_syscall 0.7.0", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[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.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +dependencies = [ + "value-bag", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[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 = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "mockito" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90820618712cab19cfc46b274c6c22546a82affcb3c3bdf0f29e3db8e1bb92c0" +dependencies = [ + "assert-json-diff", + "bytes", + "colored", + "futures-core", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "log", + "pin-project-lite", + "rand 0.9.2", + "regex", + "serde_json", + "serde_urlencoded", + "similar", + "tokio", +] + +[[package]] +name = "muda" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.10.0", + "jni-sys", + "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", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +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.10.0", + "block2", + "libc", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-text", + "objc2-core-video", + "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.10.0", + "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 = [ + "bitflags 2.10.0", + "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.10.0", + "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.10.0", + "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-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + +[[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.10.0", + "block2", + "libc", + "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.10.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-javascript-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" +dependencies = [ + "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.10.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-security" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-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.10.0", + "objc2", + "objc2-core-foundation", + "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.10.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-javascript-core", + "objc2-security", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "open" +version = "5.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags 2.10.0", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", +] + +[[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 = "ouroboros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.114", +] + +[[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" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[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 0.5.18", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pgvector" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc58e2d255979a31caa7cabfa7aac654af0354220719ab7a68520ae7a91e8c0b" +dependencies = [ + "serde", +] + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.10+spec-1.0.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-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "version_check", + "yansi", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +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 = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[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.10.0", +] + +[[package]] +name = "redox_syscall" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http 0.6.8", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "reqwest" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62" +dependencies = [ + "base64 0.22.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 0.6.8", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rust_decimal" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61f703d19852dbf87cbc513643fa81428361eb6940f1ac14fd58155d295a3eb0" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" + +[[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 = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +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.114", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sea-bae" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f694a6ab48f14bc063cfadff30ab551d3c7e46d8f81836c51989d548f44a2a25" +dependencies = [ + "heck 0.4.1", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "sea-orm" +version = "1.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d945f62558fac19e5988680d2fdf747b734c2dbc6ce2cb81ba33ed8dde5b103" +dependencies = [ + "async-stream", + "async-trait", + "bigdecimal", + "chrono", + "derive_more 2.1.1", + "futures-util", + "log", + "ouroboros", + "pgvector", + "rust_decimal", + "sea-orm-macros", + "sea-query", + "sea-query-binder", + "serde", + "serde_json", + "sqlx", + "strum", + "thiserror 2.0.18", + "time", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "sea-orm-macros" +version = "1.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c2e64a50a9cc8339f10a27577e10062c7f995488e469f2c95762c5ee847832" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "sea-bae", + "syn 2.0.114", + "unicode-ident", +] + +[[package]] +name = "sea-query" +version = "0.32.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a5d1c518eaf5eda38e5773f902b26ab6d5e9e9e2bb2349ca6c64cf96f80448c" +dependencies = [ + "bigdecimal", + "chrono", + "inherent", + "ordered-float", + "rust_decimal", + "serde_json", + "time", + "uuid", +] + +[[package]] +name = "sea-query-binder" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0019f47430f7995af63deda77e238c17323359af241233ec768aba1faea7608" +dependencies = [ + "bigdecimal", + "chrono", + "rust_decimal", + "sea-query", + "serde_json", + "sqlx", + "time", + "uuid", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more 0.99.20", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +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.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[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.114", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[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.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[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.114", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" +dependencies = [ + "libc", + "sigchld", + "windows-sys 0.60.2", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "sigchld" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" +dependencies = [ + "libc", + "os_pipe", + "signal-hook", +] + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.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 0.5.18", + "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 = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlx" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +dependencies = [ + "base64 0.22.1", + "bigdecimal", + "bytes", + "chrono", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.5", + "hashlink", + "indexmap 2.13.0", + "log", + "memchr", + "once_cell", + "percent-encoding", + "rust_decimal", + "rustls", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror 2.0.18", + "time", + "tokio", + "tokio-stream", + "tracing", + "url", + "uuid", + "webpki-roots 0.26.11", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.114", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +dependencies = [ + "dotenvy", + "either", + "heck 0.5.0", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.114", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" +dependencies = [ + "atoi", + "base64 0.22.1", + "bigdecimal", + "bitflags 2.10.0", + "byteorder", + "bytes", + "chrono", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "rsa", + "rust_decimal", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.18", + "time", + "tracing", + "uuid", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" +dependencies = [ + "atoi", + "base64 0.22.1", + "bigdecimal", + "bitflags 2.10.0", + "byteorder", + "chrono", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "num-bigint", + "once_cell", + "rand 0.8.5", + "rust_decimal", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.18", + "time", + "tracing", + "uuid", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +dependencies = [ + "atoi", + "chrono", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "thiserror 2.0.18", + "time", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +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", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +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.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[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.34.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" +dependencies = [ + "bitflags 2.10.0", + "block2", + "core-foundation 0.10.1", + "core-graphics", + "crossbeam-channel", + "dispatch", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "parking_lot", + "raw-window-handle", + "scopeguard", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[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.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463ae8677aa6d0f063a900b9c41ecd4ac2b7ca82f0b058cc4491540e55b20129" +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 0.13.1", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca7bd893329425df750813e95bd2b643d5369d929438da96d5bbb7cc2c918f74" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.11+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac423e5859d9f9ccdd32e3cf6a5866a15bedbf25aa6630bcb2acde9468f6ae3" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.114", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6a1bd2861ff0c8766b1d38b32a6a410f6dc6532d4ef534c47cfb2236092f59" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.114", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692a77abd8b8773e107a42ec0e05b767b8d2b7ece76ab36c6c3947e34df9f53f" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.11+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-plugin-log" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7545bd67f070a4500432c826e2e0682146a1d6712aee22a2786490156b574d93" +dependencies = [ + "android_logger", + "byte-unit", + "fern", + "log", + "objc2", + "objc2-foundation", + "serde", + "serde_json", + "serde_repr", + "swift-rs", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "tauri-plugin-shell" +version = "2.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8457dbf9e2bab1edd8df22bb2c20857a59a9868e79cb3eac5ed639eec4d0c73b" +dependencies = [ + "encoding_rs", + "log", + "open", + "os_pipe", + "regex", + "schemars 0.8.22", + "serde", + "serde_json", + "shared_child", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "tauri-runtime" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b885ffeac82b00f1f6fd292b6e5aabfa7435d537cef57d11e38a489956535651" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5204682391625e867d16584fedc83fc292fb998814c9f7918605c789cd876314" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcd169fccdff05eff2c1033210b9b94acd07a47e6fa9a3431cf09cfd4f01c87e" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever", + "http", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 0.9.11+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.11+spec-1.1.0", +] + +[[package]] +name = "telos-db" +version = "0.2.0" +dependencies = [ + "anyhow", + "axum", + "dotenvy", + "futures", + "log", + "mockito", + "reqwest 0.12.28", + "sea-orm", + "serde", + "serde_json", + "sqlx", + "tauri", + "tauri-build", + "tauri-plugin-log", + "tauri-plugin-shell", + "tokio", + "tower-http 0.5.2", +] + +[[package]] +name = "tempfile" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" +dependencies = [ + "fastrand", + "getrandom 0.3.4", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[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.114", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +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 = "0.9.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.14", +] + +[[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 = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +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.13.0", + "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.13.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "winnow 0.7.14", +] + +[[package]] +name = "toml_parser" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +dependencies = [ + "winnow 0.7.14", +] + +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + +[[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", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "http", + "http-body", + "http-body-util", + "pin-project-lite", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[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 = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[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.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +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.18", + "windows-sys 0.60.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.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[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.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" +dependencies = [ + "getrandom 0.3.4", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "value-bag" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[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.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.114", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[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 = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.6", +] + +[[package]] +name = "webpki-roots" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[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.114", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", +] + +[[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.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[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 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "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.114", +] + +[[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.114", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[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.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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 0.2.1", +] + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[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 = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wry" +version = "0.54.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ed1a195b0375491dd15a7066a10251be217ce743cf4bbbbdcf5391d6473bee0" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dpi", + "dunce", + "gdkx11", + "gtk", + "html5ever", + "http", + "javascriptcore-rs", + "jni", + "kuchikiki", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[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 = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "zmij" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" diff --git a/src-backend/Cargo.toml b/src-backend/Cargo.toml new file mode 100644 index 0000000..ddf7be7 --- /dev/null +++ b/src-backend/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "telos-db" +version = "0.2.0" +description = "A Tauri App" +authors = ["you"] +license = "" +repository = "" +edition = "2021" +rust-version = "1.77.2" + +[lib] +name = "telos_db_lib" +crate-type = ["lib"] + +[build-dependencies] +tauri-build = { version = "2.5.4", features = [] } + +[dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +log = "0.4" +tauri = { version = "2.10.0", features = ["tray-icon"] } +tauri-plugin-shell = "2" +tauri-plugin-log = "2" +reqwest = { version = "0.12", features = ["json"] } +tokio = { version = "1", features = ["full"] } +axum = { version = "0.7" } +anyhow = "1.0" +tower-http = { version = "0.5", features = ["cors"] } +dotenvy = "0.15" +sea-orm = { version = "1.1", features = ["sqlx-sqlite", "runtime-tokio-rustls", "macros", "with-chrono"] } +futures = "0.3" + +[dev-dependencies] +mockito = "1.4" + +[dependencies.sqlx] +version = "0.8" +features = ["sqlite", "runtime-tokio-rustls"] diff --git a/src-backend/build.rs b/src-backend/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/src-backend/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-backend/build_assets/config.json b/src-backend/build_assets/config.json new file mode 100644 index 0000000..7f21f1c --- /dev/null +++ b/src-backend/build_assets/config.json @@ -0,0 +1,11 @@ +{ + "database": { + "path": "data/vector.db" + }, + "model": { + "path": "models/embeddinggemma-300m-q4_0.gguf" + }, + "llama_server": { + "port": 8080 + } +} diff --git a/src-backend/build_assets/ggml-base.dll b/src-backend/build_assets/ggml-base.dll new file mode 100644 index 0000000..1475207 --- /dev/null +++ b/src-backend/build_assets/ggml-base.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-alderlake.dll b/src-backend/build_assets/ggml-cpu-alderlake.dll new file mode 100644 index 0000000..4ef0e18 --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-alderlake.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-cannonlake.dll b/src-backend/build_assets/ggml-cpu-cannonlake.dll new file mode 100644 index 0000000..2f27dff --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-cannonlake.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-cascadelake.dll b/src-backend/build_assets/ggml-cpu-cascadelake.dll new file mode 100644 index 0000000..4b98908 --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-cascadelake.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-cooperlake.dll b/src-backend/build_assets/ggml-cpu-cooperlake.dll new file mode 100644 index 0000000..6a97226 --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-cooperlake.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-haswell.dll b/src-backend/build_assets/ggml-cpu-haswell.dll new file mode 100644 index 0000000..256dca3 --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-haswell.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-icelake.dll b/src-backend/build_assets/ggml-cpu-icelake.dll new file mode 100644 index 0000000..d21310e --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-icelake.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-ivybridge.dll b/src-backend/build_assets/ggml-cpu-ivybridge.dll new file mode 100644 index 0000000..90038c7 --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-ivybridge.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-piledriver.dll b/src-backend/build_assets/ggml-cpu-piledriver.dll new file mode 100644 index 0000000..361740a --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-piledriver.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-sandybridge.dll b/src-backend/build_assets/ggml-cpu-sandybridge.dll new file mode 100644 index 0000000..00f0c19 --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-sandybridge.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-sapphirerapids.dll b/src-backend/build_assets/ggml-cpu-sapphirerapids.dll new file mode 100644 index 0000000..ff8ec69 --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-sapphirerapids.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-skylakex.dll b/src-backend/build_assets/ggml-cpu-skylakex.dll new file mode 100644 index 0000000..53d0089 --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-skylakex.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-sse42.dll b/src-backend/build_assets/ggml-cpu-sse42.dll new file mode 100644 index 0000000..33b37f5 --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-sse42.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-x64.dll b/src-backend/build_assets/ggml-cpu-x64.dll new file mode 100644 index 0000000..d8ebe1d --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-x64.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu-zen4.dll b/src-backend/build_assets/ggml-cpu-zen4.dll new file mode 100644 index 0000000..2c34467 --- /dev/null +++ b/src-backend/build_assets/ggml-cpu-zen4.dll Binary files differ diff --git a/src-backend/build_assets/ggml-cpu.dll b/src-backend/build_assets/ggml-cpu.dll new file mode 100644 index 0000000..2eef116 --- /dev/null +++ b/src-backend/build_assets/ggml-cpu.dll Binary files differ diff --git a/src-backend/build_assets/ggml-rpc.dll b/src-backend/build_assets/ggml-rpc.dll new file mode 100644 index 0000000..3006f11 --- /dev/null +++ b/src-backend/build_assets/ggml-rpc.dll Binary files differ diff --git a/src-backend/build_assets/ggml-vulkan.dll b/src-backend/build_assets/ggml-vulkan.dll new file mode 100644 index 0000000..7433c1a --- /dev/null +++ b/src-backend/build_assets/ggml-vulkan.dll Binary files differ diff --git a/src-backend/build_assets/ggml.dll b/src-backend/build_assets/ggml.dll new file mode 100644 index 0000000..9da7849 --- /dev/null +++ b/src-backend/build_assets/ggml.dll Binary files differ diff --git a/src-backend/build_assets/icons/128x128.png b/src-backend/build_assets/icons/128x128.png new file mode 100644 index 0000000..77e7d23 --- /dev/null +++ b/src-backend/build_assets/icons/128x128.png Binary files differ diff --git a/src-backend/build_assets/icons/128x128@2x.png b/src-backend/build_assets/icons/128x128@2x.png new file mode 100644 index 0000000..0f7976f --- /dev/null +++ b/src-backend/build_assets/icons/128x128@2x.png Binary files differ diff --git a/src-backend/build_assets/icons/32x32.png b/src-backend/build_assets/icons/32x32.png new file mode 100644 index 0000000..98fda06 --- /dev/null +++ b/src-backend/build_assets/icons/32x32.png Binary files differ diff --git a/src-backend/build_assets/icons/Square107x107Logo.png b/src-backend/build_assets/icons/Square107x107Logo.png new file mode 100644 index 0000000..f35d84f --- /dev/null +++ b/src-backend/build_assets/icons/Square107x107Logo.png Binary files differ diff --git a/src-backend/build_assets/icons/Square142x142Logo.png b/src-backend/build_assets/icons/Square142x142Logo.png new file mode 100644 index 0000000..1823bb2 --- /dev/null +++ b/src-backend/build_assets/icons/Square142x142Logo.png Binary files differ diff --git a/src-backend/build_assets/icons/Square150x150Logo.png b/src-backend/build_assets/icons/Square150x150Logo.png new file mode 100644 index 0000000..dc2b22c --- /dev/null +++ b/src-backend/build_assets/icons/Square150x150Logo.png Binary files differ diff --git a/src-backend/build_assets/icons/Square284x284Logo.png b/src-backend/build_assets/icons/Square284x284Logo.png new file mode 100644 index 0000000..0ed3984 --- /dev/null +++ b/src-backend/build_assets/icons/Square284x284Logo.png Binary files differ diff --git a/src-backend/build_assets/icons/Square30x30Logo.png b/src-backend/build_assets/icons/Square30x30Logo.png new file mode 100644 index 0000000..60bf0ea --- /dev/null +++ b/src-backend/build_assets/icons/Square30x30Logo.png Binary files differ diff --git a/src-backend/build_assets/icons/Square310x310Logo.png b/src-backend/build_assets/icons/Square310x310Logo.png new file mode 100644 index 0000000..c8ca0ad --- /dev/null +++ b/src-backend/build_assets/icons/Square310x310Logo.png Binary files differ diff --git a/src-backend/build_assets/icons/Square44x44Logo.png b/src-backend/build_assets/icons/Square44x44Logo.png new file mode 100644 index 0000000..8756459 --- /dev/null +++ b/src-backend/build_assets/icons/Square44x44Logo.png Binary files differ diff --git a/src-backend/build_assets/icons/Square71x71Logo.png b/src-backend/build_assets/icons/Square71x71Logo.png new file mode 100644 index 0000000..2c8023c --- /dev/null +++ b/src-backend/build_assets/icons/Square71x71Logo.png Binary files differ diff --git a/src-backend/build_assets/icons/Square89x89Logo.png b/src-backend/build_assets/icons/Square89x89Logo.png new file mode 100644 index 0000000..2c5e603 --- /dev/null +++ b/src-backend/build_assets/icons/Square89x89Logo.png Binary files differ diff --git a/src-backend/build_assets/icons/StoreLogo.png b/src-backend/build_assets/icons/StoreLogo.png new file mode 100644 index 0000000..17d142c --- /dev/null +++ b/src-backend/build_assets/icons/StoreLogo.png Binary files differ diff --git a/src-backend/build_assets/icons/icon.icns b/src-backend/build_assets/icons/icon.icns new file mode 100644 index 0000000..a2993ad --- /dev/null +++ b/src-backend/build_assets/icons/icon.icns Binary files differ diff --git a/src-backend/build_assets/icons/icon.ico b/src-backend/build_assets/icons/icon.ico new file mode 100644 index 0000000..06c23c8 --- /dev/null +++ b/src-backend/build_assets/icons/icon.ico Binary files differ diff --git a/src-backend/build_assets/icons/icon.png b/src-backend/build_assets/icons/icon.png new file mode 100644 index 0000000..d1756ce --- /dev/null +++ b/src-backend/build_assets/icons/icon.png Binary files differ diff --git a/src-backend/build_assets/libomp140.x86_64.dll b/src-backend/build_assets/libomp140.x86_64.dll new file mode 100644 index 0000000..7c0dd14 --- /dev/null +++ b/src-backend/build_assets/libomp140.x86_64.dll Binary files differ diff --git a/src-backend/build_assets/llama.dll b/src-backend/build_assets/llama.dll new file mode 100644 index 0000000..46a65a9 --- /dev/null +++ b/src-backend/build_assets/llama.dll Binary files differ diff --git a/src-backend/build_assets/llava_shared.dll b/src-backend/build_assets/llava_shared.dll new file mode 100644 index 0000000..583f1f0 --- /dev/null +++ b/src-backend/build_assets/llava_shared.dll Binary files differ diff --git a/src-backend/build_assets/mtmd.dll b/src-backend/build_assets/mtmd.dll new file mode 100644 index 0000000..96dd813 --- /dev/null +++ b/src-backend/build_assets/mtmd.dll Binary files differ diff --git a/src-backend/build_assets/sqlite3.dll b/src-backend/build_assets/sqlite3.dll new file mode 100644 index 0000000..1687acd --- /dev/null +++ b/src-backend/build_assets/sqlite3.dll Binary files differ diff --git a/src-backend/build_assets/vector.dll b/src-backend/build_assets/vector.dll new file mode 100644 index 0000000..6d298bc --- /dev/null +++ b/src-backend/build_assets/vector.dll Binary files differ diff --git a/src-backend/capabilities/default.json b/src-backend/capabilities/default.json new file mode 100644 index 0000000..8436679 --- /dev/null +++ b/src-backend/capabilities/default.json @@ -0,0 +1,22 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "enables the default permissions", + "windows": [ + "main" + ], + "permissions": [ + "core:default", + "shell:allow-spawn", + { + "identifier": "shell:allow-execute", + "allow": [ + { + "args": true, + "sidecar": true, + "name": "bin/llama-server" + } + ] + } + ] +} \ No newline at end of file diff --git a/src-backend/check_err.txt b/src-backend/check_err.txt new file mode 100644 index 0000000..c06d55f --- /dev/null +++ b/src-backend/check_err.txt @@ -0,0 +1,104 @@ + Checking telos-db v0.2.0 (D:\develop\TelosDB\src-backend) +warning: unused import: `Emitter` + --> src\lib.rs:16:13 + | +16 | use tauri::{Emitter, Manager}; + | ^^^^^^^ + | + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default + +error[E0597]: `clean_ext_path` does not live long enough + --> src\db.rs:19:20 + | + 10 | let clean_ext_path = extension_path + | -------------- binding `clean_ext_path` declared here +... + 17 | let options = SqliteConnectOptions::from_str(&db_url)? + | ___________________- + 18 | | .create_if_missing(true) + 19 | | .extension(&clean_ext_path); + | |____________________^^^^^^^^^^^^^^^- argument requires that `clean_ext_path` is borrowed for `'static` + | | + | borrowed value does not live long enough +... +107 | } + | - `clean_ext_path` dropped here while still borrowed + | +note: requirement that the value outlives `'static` introduced here + --> C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\sqlx-sqlite-0.8.6\src\options\mod.rs:487:53 + | +487 | pub fn extension(mut self, extension_name: impl Into>) -> Self { + | ^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0599]: no method named `emit` found for struct `AppHandle` in the current scope + --> src\mcp\mod.rs:28:28 + | + 28 | let _ = app_handle.emit("mcp-connection-update", new_count); + | ^^^^ + | + ::: C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\lib.rs:952:6 + | +952 | fn emit(&self, event: &str, payload: S) -> Result<()> { + | ---- the method is available for `AppHandle` here + | + = help: items from traits can only be used if the trait is in scope +help: there is a method `exit` with a similar name, but with different arguments + --> C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:532:3 + | +532 | pub fn exit(&self, exit_code: i32) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +help: trait `Emitter` which provides `emit` is implemented but not in scope; perhaps you want to import it + | + 1 + use tauri::Emitter; + | + +error[E0599]: no method named `emit` found for struct `AppHandle` in the current scope + --> src\mcp\mod.rs:37:33 + | + 37 | let _ = self.app_handle.emit("mcp-connection-update", new_count); + | ^^^^ + | + ::: C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\lib.rs:952:6 + | +952 | fn emit(&self, event: &str, payload: S) -> Result<()> { + | ---- the method is available for `AppHandle` here + | + = help: items from traits can only be used if the trait is in scope +help: there is a method `exit` with a similar name, but with different arguments + --> C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:532:3 + | +532 | pub fn exit(&self, exit_code: i32) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +help: trait `Emitter` which provides `emit` is implemented but not in scope; perhaps you want to import it + | + 1 + use tauri::Emitter; + | + +error[E0308]: mismatched types + --> src\lib.rs:523:50 + | +523 | tray_builder = tray_builder.icon(icon); // Tauri 2 likely takes &Image or handles conversion + | ---- ^^^^ expected `Image<'_>`, found `&Image<'_>` + | | + | arguments to this method are incorrect + | +note: method defined here + --> C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\tray\mod.rs:252:10 + | +252 | pub fn icon(mut self, icon: Image<'_>) -> Self { + | ^^^^ + +warning: variable does not need to be mutable + --> src\lib.rs:380:9 + | +380 | let mut model_path = base_dir.join("models").join("embeddinggemma-300m-q4_0.gguf"); + | ----^^^^^^^^^^ + | | + | help: remove this `mut` + | + = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default + +Some errors have detailed explanations: E0308, E0597, E0599. +For more information about an error, try `rustc --explain E0308`. +warning: `telos-db` (lib) generated 2 warnings +error: could not compile `telos-db` (lib) due to 4 previous errors; 2 warnings emitted diff --git a/src-backend/check_err_final.txt b/src-backend/check_err_final.txt new file mode 100644 index 0000000..c06d55f --- /dev/null +++ b/src-backend/check_err_final.txt @@ -0,0 +1,104 @@ + Checking telos-db v0.2.0 (D:\develop\TelosDB\src-backend) +warning: unused import: `Emitter` + --> src\lib.rs:16:13 + | +16 | use tauri::{Emitter, Manager}; + | ^^^^^^^ + | + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default + +error[E0597]: `clean_ext_path` does not live long enough + --> src\db.rs:19:20 + | + 10 | let clean_ext_path = extension_path + | -------------- binding `clean_ext_path` declared here +... + 17 | let options = SqliteConnectOptions::from_str(&db_url)? + | ___________________- + 18 | | .create_if_missing(true) + 19 | | .extension(&clean_ext_path); + | |____________________^^^^^^^^^^^^^^^- argument requires that `clean_ext_path` is borrowed for `'static` + | | + | borrowed value does not live long enough +... +107 | } + | - `clean_ext_path` dropped here while still borrowed + | +note: requirement that the value outlives `'static` introduced here + --> C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\sqlx-sqlite-0.8.6\src\options\mod.rs:487:53 + | +487 | pub fn extension(mut self, extension_name: impl Into>) -> Self { + | ^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0599]: no method named `emit` found for struct `AppHandle` in the current scope + --> src\mcp\mod.rs:28:28 + | + 28 | let _ = app_handle.emit("mcp-connection-update", new_count); + | ^^^^ + | + ::: C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\lib.rs:952:6 + | +952 | fn emit(&self, event: &str, payload: S) -> Result<()> { + | ---- the method is available for `AppHandle` here + | + = help: items from traits can only be used if the trait is in scope +help: there is a method `exit` with a similar name, but with different arguments + --> C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:532:3 + | +532 | pub fn exit(&self, exit_code: i32) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +help: trait `Emitter` which provides `emit` is implemented but not in scope; perhaps you want to import it + | + 1 + use tauri::Emitter; + | + +error[E0599]: no method named `emit` found for struct `AppHandle` in the current scope + --> src\mcp\mod.rs:37:33 + | + 37 | let _ = self.app_handle.emit("mcp-connection-update", new_count); + | ^^^^ + | + ::: C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\lib.rs:952:6 + | +952 | fn emit(&self, event: &str, payload: S) -> Result<()> { + | ---- the method is available for `AppHandle` here + | + = help: items from traits can only be used if the trait is in scope +help: there is a method `exit` with a similar name, but with different arguments + --> C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:532:3 + | +532 | pub fn exit(&self, exit_code: i32) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +help: trait `Emitter` which provides `emit` is implemented but not in scope; perhaps you want to import it + | + 1 + use tauri::Emitter; + | + +error[E0308]: mismatched types + --> src\lib.rs:523:50 + | +523 | tray_builder = tray_builder.icon(icon); // Tauri 2 likely takes &Image or handles conversion + | ---- ^^^^ expected `Image<'_>`, found `&Image<'_>` + | | + | arguments to this method are incorrect + | +note: method defined here + --> C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\tray\mod.rs:252:10 + | +252 | pub fn icon(mut self, icon: Image<'_>) -> Self { + | ^^^^ + +warning: variable does not need to be mutable + --> src\lib.rs:380:9 + | +380 | let mut model_path = base_dir.join("models").join("embeddinggemma-300m-q4_0.gguf"); + | ----^^^^^^^^^^ + | | + | help: remove this `mut` + | + = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default + +Some errors have detailed explanations: E0308, E0597, E0599. +For more information about an error, try `rustc --explain E0308`. +warning: `telos-db` (lib) generated 2 warnings +error: could not compile `telos-db` (lib) due to 4 previous errors; 2 warnings emitted diff --git a/src-backend/check_err_v2.txt b/src-backend/check_err_v2.txt new file mode 100644 index 0000000..6a5747e --- /dev/null +++ b/src-backend/check_err_v2.txt @@ -0,0 +1,34 @@ + Checking telos-db v0.2.0 (D:\develop\TelosDB\src-backend) +error[E0382]: borrow of moved value: `clean_ext_path` + --> src\db.rs:34:27 + | +10 | let clean_ext_path = extension_path + | -------------- move occurs because `clean_ext_path` has type `std::string::String`, which does not implement the `Copy` trait +... +15 | let static_ext_path: &'static str = Box::leak(clean_ext_path.into_boxed_str()); + | ---------------- `clean_ext_path` moved due to this method call +... +34 | let ext_path_no_dll = clean_ext_path.trim_end_matches(".dll"); + | ^^^^^^^^^^^^^^ value borrowed here after move + | +note: `std::string::String::into_boxed_str` takes ownership of the receiver `self`, which moves `clean_ext_path` + --> /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\alloc\src\string.rs:2171:27 + = note: borrow occurs due to deref coercion to `str` +help: you can `clone` the value and consume it, but this might not be your desired behavior + | +15 | let static_ext_path: &'static str = Box::leak(clean_ext_path.clone().into_boxed_str()); + | ++++++++ + +warning: variable does not need to be mutable + --> src\lib.rs:380:9 + | +380 | let mut model_path = base_dir.join("models").join("embeddinggemma-300m-q4_0.gguf"); + | ----^^^^^^^^^^ + | | + | help: remove this `mut` + | + = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default + +For more information about this error, try `rustc --explain E0382`. +warning: `telos-db` (lib) generated 1 warning +error: could not compile `telos-db` (lib) due to 1 previous error; 1 warning emitted diff --git a/src-backend/check_output.txt b/src-backend/check_output.txt new file mode 100644 index 0000000..651b99b --- /dev/null +++ b/src-backend/check_output.txt @@ -0,0 +1,45 @@ + Checking telos-db v0.2.0 (D:\develop\TelosDB\src-backend) +warning: unused import: `Emitter` + --> src\lib.rs:16:13 + | +16 | use tauri::{Emitter, Manager}; + | ^^^^^^^ + | + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default + +error[E0597]: `clean_ext_path` does not live long enough + --> src\db.rs:19:20 + | + 10 | let clean_ext_path = extension_path + | -------------- binding `clean_ext_path` declared here +... + 17 | let options = SqliteConnectOptions::from_str(&db_url)? + | ___________________- + 18 | | .create_if_missing(true) + 19 | | .extension(&clean_ext_path); + | |____________________^^^^^^^^^^^^^^^- argument requires that `clean_ext_path` is borrowed for `'static` + | | + | borrowed value does not live long enough +... +107 | } + | - `clean_ext_path` dropped here while still borrowed + | +note: requirement that the value outlives `'static` introduced here + --> C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\sqlx-sqlite-0.8.6\src\options\mod.rs:487:53 + | +487 | pub fn extension(mut self, extension_name: impl Into>) -> Self { + | ^^^^^^^^^^^^^^^^^^^^^^^ + +warning: variable does not need to be mutable + --> src\lib.rs:380:9 + | +380 | let mut model_path = base_dir.join("models").join("embeddinggemma-300m-q4_0.gguf"); + | ----^^^^^^^^^^ + | | + | help: remove this `mut` + | + = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default + +For more information about this error, try `rustc --explain E0597`. +warning: `telos-db` (lib) generated 2 warnings +error: could not compile `telos-db` (lib) due to 1 previous error; 2 warnings emitted diff --git a/src-backend/gen/schemas/acl-manifests.json b/src-backend/gen/schemas/acl-manifests.json new file mode 100644 index 0000000..6ad5859 --- /dev/null +++ b/src-backend/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"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-remove-listener":{"identifier":"deny-remove-listener","description":"Denies the remove_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_listener"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-set-dock-visibility":{"identifier":"deny-set-dock-visibility","description":"Denies the set_dock_visibility command without any pre-configured scope.","commands":{"allow":[],"deny":["set_dock_visibility"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-auto-resize":{"identifier":"allow-set-webview-auto-resize","description":"Enables the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":["set_webview_auto_resize"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-auto-resize":{"identifier":"deny-set-webview-auto-resize","description":"Denies the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_auto_resize"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-focusable":{"identifier":"allow-set-focusable","description":"Enables the set_focusable command without any pre-configured scope.","commands":{"allow":["set_focusable"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-simple-fullscreen":{"identifier":"allow-set-simple-fullscreen","description":"Enables the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":["set_simple_fullscreen"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-focusable":{"identifier":"deny-set-focusable","description":"Denies the set_focusable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focusable"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-simple-fullscreen":{"identifier":"deny-set-simple-fullscreen","description":"Denies the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_simple_fullscreen"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"log":{"default_permission":{"identifier":"default","description":"Allows the log command","permissions":["allow-log"]},"permissions":{"allow-log":{"identifier":"allow-log","description":"Enables the log command without any pre-configured scope.","commands":{"allow":["log"],"deny":[]}},"deny-log":{"identifier":"deny-log","description":"Denies the log command without any pre-configured scope.","commands":{"allow":[],"deny":["log"]}}},"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/src-backend/gen/schemas/capabilities.json b/src-backend/gen/schemas/capabilities.json new file mode 100644 index 0000000..901d8e0 --- /dev/null +++ b/src-backend/gen/schemas/capabilities.json @@ -0,0 +1 @@ +{"default":{"identifier":"default","description":"enables the default permissions","local":true,"windows":["main"],"permissions":["core:default","shell:allow-spawn",{"identifier":"shell:allow-execute","allow":[{"args":true,"name":"bin/llama-server","sidecar":true}]}]}} \ No newline at end of file diff --git a/src-backend/gen/schemas/desktop-schema.json b/src-backend/gen/schemas/desktop-schema.json new file mode 100644 index 0000000..209ea45 --- /dev/null +++ b/src-backend/gen/schemas/desktop-schema.json @@ -0,0 +1,2582 @@ +{ + "$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`", + "type": "string", + "const": "core:app:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`" + }, + { + "description": "Enables the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-hide", + "markdownDescription": "Enables the app_hide command without any pre-configured scope." + }, + { + "description": "Enables the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-show", + "markdownDescription": "Enables the app_show command without any pre-configured scope." + }, + { + "description": "Enables the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-bundle-type", + "markdownDescription": "Enables the bundle_type command without any pre-configured scope." + }, + { + "description": "Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-default-window-icon", + "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." + }, + { + "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-fetch-data-store-identifiers", + "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Enables the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-identifier", + "markdownDescription": "Enables the identifier command without any pre-configured scope." + }, + { + "description": "Enables the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-name", + "markdownDescription": "Enables the name command without any pre-configured scope." + }, + { + "description": "Enables the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-register-listener", + "markdownDescription": "Enables the register_listener command without any pre-configured scope." + }, + { + "description": "Enables the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-data-store", + "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." + }, + { + "description": "Enables the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-listener", + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." + }, + { + "description": "Enables the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-app-theme", + "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-dock-visibility", + "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-tauri-version", + "markdownDescription": "Enables the tauri_version command without any pre-configured scope." + }, + { + "description": "Enables the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-version", + "markdownDescription": "Enables the version command without any pre-configured scope." + }, + { + "description": "Denies the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-hide", + "markdownDescription": "Denies the app_hide command without any pre-configured scope." + }, + { + "description": "Denies the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-show", + "markdownDescription": "Denies the app_show command without any pre-configured scope." + }, + { + "description": "Denies the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-bundle-type", + "markdownDescription": "Denies the bundle_type command without any pre-configured scope." + }, + { + "description": "Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-default-window-icon", + "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." + }, + { + "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-fetch-data-store-identifiers", + "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Denies the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-identifier", + "markdownDescription": "Denies the identifier command without any pre-configured scope." + }, + { + "description": "Denies the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-name", + "markdownDescription": "Denies the name command without any pre-configured scope." + }, + { + "description": "Denies the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-register-listener", + "markdownDescription": "Denies the register_listener command without any pre-configured scope." + }, + { + "description": "Denies the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-data-store", + "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." + }, + { + "description": "Denies the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-listener", + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." + }, + { + "description": "Denies the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-app-theme", + "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-dock-visibility", + "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-tauri-version", + "markdownDescription": "Denies the tauri_version command without any pre-configured scope." + }, + { + "description": "Denies the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-version", + "markdownDescription": "Denies the version command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", + "type": "string", + "const": "core:event:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" + }, + { + "description": "Enables the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit", + "markdownDescription": "Enables the emit command without any pre-configured scope." + }, + { + "description": "Enables the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit-to", + "markdownDescription": "Enables the emit_to command without any pre-configured scope." + }, + { + "description": "Enables the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-listen", + "markdownDescription": "Enables the listen command without any pre-configured scope." + }, + { + "description": "Enables the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-unlisten", + "markdownDescription": "Enables the unlisten command without any pre-configured scope." + }, + { + "description": "Denies the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit", + "markdownDescription": "Denies the emit command without any pre-configured scope." + }, + { + "description": "Denies the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit-to", + "markdownDescription": "Denies the emit_to command without any pre-configured scope." + }, + { + "description": "Denies the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-listen", + "markdownDescription": "Denies the listen command without any pre-configured scope." + }, + { + "description": "Denies the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-unlisten", + "markdownDescription": "Denies the unlisten command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", + "type": "string", + "const": "core:image:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" + }, + { + "description": "Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-bytes", + "markdownDescription": "Enables the from_bytes command without any pre-configured scope." + }, + { + "description": "Enables the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-path", + "markdownDescription": "Enables the from_path command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-rgba", + "markdownDescription": "Enables the rgba command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-bytes", + "markdownDescription": "Denies the from_bytes command without any pre-configured scope." + }, + { + "description": "Denies the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-path", + "markdownDescription": "Denies the from_path command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-rgba", + "markdownDescription": "Denies the rgba command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", + "type": "string", + "const": "core:menu:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" + }, + { + "description": "Enables the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-append", + "markdownDescription": "Enables the append command without any pre-configured scope." + }, + { + "description": "Enables the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-create-default", + "markdownDescription": "Enables the create_default command without any pre-configured scope." + }, + { + "description": "Enables the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-get", + "markdownDescription": "Enables the get command without any pre-configured scope." + }, + { + "description": "Enables the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-insert", + "markdownDescription": "Enables the insert command without any pre-configured scope." + }, + { + "description": "Enables the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-checked", + "markdownDescription": "Enables the is_checked command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-items", + "markdownDescription": "Enables the items command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-popup", + "markdownDescription": "Enables the popup command without any pre-configured scope." + }, + { + "description": "Enables the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-prepend", + "markdownDescription": "Enables the prepend command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove-at", + "markdownDescription": "Enables the remove_at command without any pre-configured scope." + }, + { + "description": "Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-accelerator", + "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." + }, + { + "description": "Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-app-menu", + "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-help-menu-for-nsapp", + "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-window-menu", + "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-windows-menu-for-nsapp", + "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-checked", + "markdownDescription": "Enables the set_checked command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-text", + "markdownDescription": "Enables the set_text command without any pre-configured scope." + }, + { + "description": "Enables the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-text", + "markdownDescription": "Enables the text command without any pre-configured scope." + }, + { + "description": "Denies the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-append", + "markdownDescription": "Denies the append command without any pre-configured scope." + }, + { + "description": "Denies the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-create-default", + "markdownDescription": "Denies the create_default command without any pre-configured scope." + }, + { + "description": "Denies the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-get", + "markdownDescription": "Denies the get command without any pre-configured scope." + }, + { + "description": "Denies the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-insert", + "markdownDescription": "Denies the insert command without any pre-configured scope." + }, + { + "description": "Denies the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-checked", + "markdownDescription": "Denies the is_checked command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-items", + "markdownDescription": "Denies the items command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-popup", + "markdownDescription": "Denies the popup command without any pre-configured scope." + }, + { + "description": "Denies the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-prepend", + "markdownDescription": "Denies the prepend command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove-at", + "markdownDescription": "Denies the remove_at command without any pre-configured scope." + }, + { + "description": "Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-accelerator", + "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." + }, + { + "description": "Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-app-menu", + "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-help-menu-for-nsapp", + "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-window-menu", + "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-windows-menu-for-nsapp", + "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-checked", + "markdownDescription": "Denies the set_checked command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-text", + "markdownDescription": "Denies the set_text command without any pre-configured scope." + }, + { + "description": "Denies the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-text", + "markdownDescription": "Denies the text command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", + "type": "string", + "const": "core:path:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" + }, + { + "description": "Enables the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-basename", + "markdownDescription": "Enables the basename command without any pre-configured scope." + }, + { + "description": "Enables the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-dirname", + "markdownDescription": "Enables the dirname command without any pre-configured scope." + }, + { + "description": "Enables the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-extname", + "markdownDescription": "Enables the extname command without any pre-configured scope." + }, + { + "description": "Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-is-absolute", + "markdownDescription": "Enables the is_absolute command without any pre-configured scope." + }, + { + "description": "Enables the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-join", + "markdownDescription": "Enables the join command without any pre-configured scope." + }, + { + "description": "Enables the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-normalize", + "markdownDescription": "Enables the normalize command without any pre-configured scope." + }, + { + "description": "Enables the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve", + "markdownDescription": "Enables the resolve command without any pre-configured scope." + }, + { + "description": "Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve-directory", + "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." + }, + { + "description": "Denies the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-basename", + "markdownDescription": "Denies the basename command without any pre-configured scope." + }, + { + "description": "Denies the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-dirname", + "markdownDescription": "Denies the dirname command without any pre-configured scope." + }, + { + "description": "Denies the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-extname", + "markdownDescription": "Denies the extname command without any pre-configured scope." + }, + { + "description": "Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-is-absolute", + "markdownDescription": "Denies the is_absolute command without any pre-configured scope." + }, + { + "description": "Denies the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-join", + "markdownDescription": "Denies the join command without any pre-configured scope." + }, + { + "description": "Denies the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-normalize", + "markdownDescription": "Denies the normalize command without any pre-configured scope." + }, + { + "description": "Denies the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve", + "markdownDescription": "Denies the resolve command without any pre-configured scope." + }, + { + "description": "Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve-directory", + "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", + "type": "string", + "const": "core:resources:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`", + "type": "string", + "const": "core:tray:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`" + }, + { + "description": "Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-get-by-id", + "markdownDescription": "Enables the get_by_id command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-remove-by-id", + "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-as-template", + "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-menu", + "markdownDescription": "Enables the set_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-show-menu-on-left-click", + "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-temp-dir-path", + "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-tooltip", + "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." + }, + { + "description": "Enables the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-visible", + "markdownDescription": "Enables the set_visible command without any pre-configured scope." + }, + { + "description": "Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-get-by-id", + "markdownDescription": "Denies the get_by_id command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-remove-by-id", + "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-as-template", + "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-menu", + "markdownDescription": "Denies the set_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-show-menu-on-left-click", + "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-temp-dir-path", + "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-tooltip", + "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." + }, + { + "description": "Denies the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-visible", + "markdownDescription": "Denies the set_visible command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", + "type": "string", + "const": "core:webview:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" + }, + { + "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-clear-all-browsing-data", + "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Enables the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview", + "markdownDescription": "Enables the create_webview command without any pre-configured scope." + }, + { + "description": "Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview-window", + "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." + }, + { + "description": "Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-get-all-webviews", + "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-internal-toggle-devtools", + "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Enables the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-print", + "markdownDescription": "Enables the print command without any pre-configured scope." + }, + { + "description": "Enables the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-reparent", + "markdownDescription": "Enables the reparent command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-auto-resize", + "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-background-color", + "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-focus", + "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-position", + "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-size", + "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-zoom", + "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Enables the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-close", + "markdownDescription": "Enables the webview_close command without any pre-configured scope." + }, + { + "description": "Enables the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-hide", + "markdownDescription": "Enables the webview_hide command without any pre-configured scope." + }, + { + "description": "Enables the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-position", + "markdownDescription": "Enables the webview_position command without any pre-configured scope." + }, + { + "description": "Enables the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-show", + "markdownDescription": "Enables the webview_show command without any pre-configured scope." + }, + { + "description": "Enables the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-size", + "markdownDescription": "Enables the webview_size command without any pre-configured scope." + }, + { + "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-clear-all-browsing-data", + "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Denies the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview", + "markdownDescription": "Denies the create_webview command without any pre-configured scope." + }, + { + "description": "Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview-window", + "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." + }, + { + "description": "Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-get-all-webviews", + "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-internal-toggle-devtools", + "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Denies the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-print", + "markdownDescription": "Denies the print command without any pre-configured scope." + }, + { + "description": "Denies the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-reparent", + "markdownDescription": "Denies the reparent command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-auto-resize", + "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-background-color", + "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-focus", + "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-position", + "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-size", + "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-zoom", + "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Denies the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-close", + "markdownDescription": "Denies the webview_close command without any pre-configured scope." + }, + { + "description": "Denies the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-hide", + "markdownDescription": "Denies the webview_hide command without any pre-configured scope." + }, + { + "description": "Denies the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-position", + "markdownDescription": "Denies the webview_position command without any pre-configured scope." + }, + { + "description": "Denies the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-show", + "markdownDescription": "Denies the webview_show command without any pre-configured scope." + }, + { + "description": "Denies the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-size", + "markdownDescription": "Denies the webview_size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`", + "type": "string", + "const": "core:window:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`" + }, + { + "description": "Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-available-monitors", + "markdownDescription": "Enables the available_monitors command without any pre-configured scope." + }, + { + "description": "Enables the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-center", + "markdownDescription": "Enables the center command without any pre-configured scope." + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-current-monitor", + "markdownDescription": "Enables the current_monitor command without any pre-configured scope." + }, + { + "description": "Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-cursor-position", + "markdownDescription": "Enables the cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-destroy", + "markdownDescription": "Enables the destroy command without any pre-configured scope." + }, + { + "description": "Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-get-all-windows", + "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." + }, + { + "description": "Enables the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-hide", + "markdownDescription": "Enables the hide command without any pre-configured scope." + }, + { + "description": "Enables the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-position", + "markdownDescription": "Enables the inner_position command without any pre-configured scope." + }, + { + "description": "Enables the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-size", + "markdownDescription": "Enables the inner_size command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-internal-toggle-maximize", + "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-always-on-top", + "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-closable", + "markdownDescription": "Enables the is_closable command without any pre-configured scope." + }, + { + "description": "Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-decorated", + "markdownDescription": "Enables the is_decorated command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-focused", + "markdownDescription": "Enables the is_focused command without any pre-configured scope." + }, + { + "description": "Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-fullscreen", + "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximizable", + "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximized", + "markdownDescription": "Enables the is_maximized command without any pre-configured scope." + }, + { + "description": "Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimizable", + "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimized", + "markdownDescription": "Enables the is_minimized command without any pre-configured scope." + }, + { + "description": "Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-resizable", + "markdownDescription": "Enables the is_resizable command without any pre-configured scope." + }, + { + "description": "Enables the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-visible", + "markdownDescription": "Enables the is_visible command without any pre-configured scope." + }, + { + "description": "Enables the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-maximize", + "markdownDescription": "Enables the maximize command without any pre-configured scope." + }, + { + "description": "Enables the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-minimize", + "markdownDescription": "Enables the minimize command without any pre-configured scope." + }, + { + "description": "Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-monitor-from-point", + "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Enables the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-position", + "markdownDescription": "Enables the outer_position command without any pre-configured scope." + }, + { + "description": "Enables the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-size", + "markdownDescription": "Enables the outer_size command without any pre-configured scope." + }, + { + "description": "Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-primary-monitor", + "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." + }, + { + "description": "Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-request-user-attention", + "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." + }, + { + "description": "Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scale-factor", + "markdownDescription": "Enables the scale_factor command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-bottom", + "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-top", + "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-background-color", + "markdownDescription": "Enables the set_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-count", + "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-label", + "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." + }, + { + "description": "Enables the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-closable", + "markdownDescription": "Enables the set_closable command without any pre-configured scope." + }, + { + "description": "Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-content-protected", + "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-grab", + "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-icon", + "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-position", + "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-visible", + "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-decorations", + "markdownDescription": "Enables the set_decorations command without any pre-configured scope." + }, + { + "description": "Enables the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-effects", + "markdownDescription": "Enables the set_effects command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focus", + "markdownDescription": "Enables the set_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focusable", + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." + }, + { + "description": "Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-fullscreen", + "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-ignore-cursor-events", + "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-max-size", + "markdownDescription": "Enables the set_max_size command without any pre-configured scope." + }, + { + "description": "Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-maximizable", + "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-min-size", + "markdownDescription": "Enables the set_min_size command without any pre-configured scope." + }, + { + "description": "Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-minimizable", + "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-overlay-icon", + "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-position", + "markdownDescription": "Enables the set_position command without any pre-configured scope." + }, + { + "description": "Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-progress-bar", + "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-resizable", + "markdownDescription": "Enables the set_resizable command without any pre-configured scope." + }, + { + "description": "Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-shadow", + "markdownDescription": "Enables the set_shadow command without any pre-configured scope." + }, + { + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-simple-fullscreen", + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size", + "markdownDescription": "Enables the set_size command without any pre-configured scope." + }, + { + "description": "Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size-constraints", + "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-skip-taskbar", + "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Enables the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-theme", + "markdownDescription": "Enables the set_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title-bar-style", + "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-visible-on-all-workspaces", + "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Enables the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-show", + "markdownDescription": "Enables the show command without any pre-configured scope." + }, + { + "description": "Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-dragging", + "markdownDescription": "Enables the start_dragging command without any pre-configured scope." + }, + { + "description": "Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-resize-dragging", + "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Enables the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-theme", + "markdownDescription": "Enables the theme command without any pre-configured scope." + }, + { + "description": "Enables the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-title", + "markdownDescription": "Enables the title command without any pre-configured scope." + }, + { + "description": "Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-toggle-maximize", + "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unmaximize", + "markdownDescription": "Enables the unmaximize command without any pre-configured scope." + }, + { + "description": "Enables the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unminimize", + "markdownDescription": "Enables the unminimize command without any pre-configured scope." + }, + { + "description": "Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-available-monitors", + "markdownDescription": "Denies the available_monitors command without any pre-configured scope." + }, + { + "description": "Denies the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-center", + "markdownDescription": "Denies the center command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-current-monitor", + "markdownDescription": "Denies the current_monitor command without any pre-configured scope." + }, + { + "description": "Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-cursor-position", + "markdownDescription": "Denies the cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-destroy", + "markdownDescription": "Denies the destroy command without any pre-configured scope." + }, + { + "description": "Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-get-all-windows", + "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." + }, + { + "description": "Denies the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-hide", + "markdownDescription": "Denies the hide command without any pre-configured scope." + }, + { + "description": "Denies the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-position", + "markdownDescription": "Denies the inner_position command without any pre-configured scope." + }, + { + "description": "Denies the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-size", + "markdownDescription": "Denies the inner_size command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-internal-toggle-maximize", + "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-always-on-top", + "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-closable", + "markdownDescription": "Denies the is_closable command without any pre-configured scope." + }, + { + "description": "Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-decorated", + "markdownDescription": "Denies the is_decorated command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-focused", + "markdownDescription": "Denies the is_focused command without any pre-configured scope." + }, + { + "description": "Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-fullscreen", + "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximizable", + "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximized", + "markdownDescription": "Denies the is_maximized command without any pre-configured scope." + }, + { + "description": "Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimizable", + "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimized", + "markdownDescription": "Denies the is_minimized command without any pre-configured scope." + }, + { + "description": "Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-resizable", + "markdownDescription": "Denies the is_resizable command without any pre-configured scope." + }, + { + "description": "Denies the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-visible", + "markdownDescription": "Denies the is_visible command without any pre-configured scope." + }, + { + "description": "Denies the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-maximize", + "markdownDescription": "Denies the maximize command without any pre-configured scope." + }, + { + "description": "Denies the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-minimize", + "markdownDescription": "Denies the minimize command without any pre-configured scope." + }, + { + "description": "Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-monitor-from-point", + "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Denies the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-position", + "markdownDescription": "Denies the outer_position command without any pre-configured scope." + }, + { + "description": "Denies the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-size", + "markdownDescription": "Denies the outer_size command without any pre-configured scope." + }, + { + "description": "Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-primary-monitor", + "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." + }, + { + "description": "Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-request-user-attention", + "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." + }, + { + "description": "Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scale-factor", + "markdownDescription": "Denies the scale_factor command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-bottom", + "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-top", + "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-background-color", + "markdownDescription": "Denies the set_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-count", + "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-label", + "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." + }, + { + "description": "Denies the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-closable", + "markdownDescription": "Denies the set_closable command without any pre-configured scope." + }, + { + "description": "Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-content-protected", + "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-grab", + "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-icon", + "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-position", + "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-visible", + "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-decorations", + "markdownDescription": "Denies the set_decorations command without any pre-configured scope." + }, + { + "description": "Denies the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-effects", + "markdownDescription": "Denies the set_effects command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focus", + "markdownDescription": "Denies the set_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focusable", + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." + }, + { + "description": "Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-fullscreen", + "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-ignore-cursor-events", + "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-max-size", + "markdownDescription": "Denies the set_max_size command without any pre-configured scope." + }, + { + "description": "Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-maximizable", + "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-min-size", + "markdownDescription": "Denies the set_min_size command without any pre-configured scope." + }, + { + "description": "Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-minimizable", + "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-overlay-icon", + "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-position", + "markdownDescription": "Denies the set_position command without any pre-configured scope." + }, + { + "description": "Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-progress-bar", + "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-resizable", + "markdownDescription": "Denies the set_resizable command without any pre-configured scope." + }, + { + "description": "Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-shadow", + "markdownDescription": "Denies the set_shadow command without any pre-configured scope." + }, + { + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-simple-fullscreen", + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size", + "markdownDescription": "Denies the set_size command without any pre-configured scope." + }, + { + "description": "Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size-constraints", + "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-skip-taskbar", + "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Denies the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-theme", + "markdownDescription": "Denies the set_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title-bar-style", + "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-visible-on-all-workspaces", + "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Denies the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-show", + "markdownDescription": "Denies the show command without any pre-configured scope." + }, + { + "description": "Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-dragging", + "markdownDescription": "Denies the start_dragging command without any pre-configured scope." + }, + { + "description": "Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-resize-dragging", + "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Denies the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-theme", + "markdownDescription": "Denies the theme command without any pre-configured scope." + }, + { + "description": "Denies the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-title", + "markdownDescription": "Denies the title command without any pre-configured scope." + }, + { + "description": "Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-toggle-maximize", + "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unmaximize", + "markdownDescription": "Denies the unmaximize command without any pre-configured scope." + }, + { + "description": "Denies the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unminimize", + "markdownDescription": "Denies the unminimize command without any pre-configured scope." + }, + { + "description": "Allows the log command\n#### This default permission set includes:\n\n- `allow-log`", + "type": "string", + "const": "log:default", + "markdownDescription": "Allows the log command\n#### This default permission set includes:\n\n- `allow-log`" + }, + { + "description": "Enables the log command without any pre-configured scope.", + "type": "string", + "const": "log:allow-log", + "markdownDescription": "Enables the log command without any pre-configured scope." + }, + { + "description": "Denies the log command without any pre-configured scope.", + "type": "string", + "const": "log:deny-log", + "markdownDescription": "Denies the log 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/src-backend/gen/schemas/windows-schema.json b/src-backend/gen/schemas/windows-schema.json new file mode 100644 index 0000000..209ea45 --- /dev/null +++ b/src-backend/gen/schemas/windows-schema.json @@ -0,0 +1,2582 @@ +{ + "$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`", + "type": "string", + "const": "core:app:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`" + }, + { + "description": "Enables the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-hide", + "markdownDescription": "Enables the app_hide command without any pre-configured scope." + }, + { + "description": "Enables the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-show", + "markdownDescription": "Enables the app_show command without any pre-configured scope." + }, + { + "description": "Enables the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-bundle-type", + "markdownDescription": "Enables the bundle_type command without any pre-configured scope." + }, + { + "description": "Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-default-window-icon", + "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." + }, + { + "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-fetch-data-store-identifiers", + "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Enables the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-identifier", + "markdownDescription": "Enables the identifier command without any pre-configured scope." + }, + { + "description": "Enables the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-name", + "markdownDescription": "Enables the name command without any pre-configured scope." + }, + { + "description": "Enables the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-register-listener", + "markdownDescription": "Enables the register_listener command without any pre-configured scope." + }, + { + "description": "Enables the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-data-store", + "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." + }, + { + "description": "Enables the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-listener", + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." + }, + { + "description": "Enables the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-app-theme", + "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-dock-visibility", + "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-tauri-version", + "markdownDescription": "Enables the tauri_version command without any pre-configured scope." + }, + { + "description": "Enables the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-version", + "markdownDescription": "Enables the version command without any pre-configured scope." + }, + { + "description": "Denies the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-hide", + "markdownDescription": "Denies the app_hide command without any pre-configured scope." + }, + { + "description": "Denies the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-show", + "markdownDescription": "Denies the app_show command without any pre-configured scope." + }, + { + "description": "Denies the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-bundle-type", + "markdownDescription": "Denies the bundle_type command without any pre-configured scope." + }, + { + "description": "Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-default-window-icon", + "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." + }, + { + "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-fetch-data-store-identifiers", + "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Denies the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-identifier", + "markdownDescription": "Denies the identifier command without any pre-configured scope." + }, + { + "description": "Denies the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-name", + "markdownDescription": "Denies the name command without any pre-configured scope." + }, + { + "description": "Denies the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-register-listener", + "markdownDescription": "Denies the register_listener command without any pre-configured scope." + }, + { + "description": "Denies the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-data-store", + "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." + }, + { + "description": "Denies the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-listener", + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." + }, + { + "description": "Denies the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-app-theme", + "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-dock-visibility", + "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-tauri-version", + "markdownDescription": "Denies the tauri_version command without any pre-configured scope." + }, + { + "description": "Denies the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-version", + "markdownDescription": "Denies the version command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", + "type": "string", + "const": "core:event:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" + }, + { + "description": "Enables the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit", + "markdownDescription": "Enables the emit command without any pre-configured scope." + }, + { + "description": "Enables the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit-to", + "markdownDescription": "Enables the emit_to command without any pre-configured scope." + }, + { + "description": "Enables the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-listen", + "markdownDescription": "Enables the listen command without any pre-configured scope." + }, + { + "description": "Enables the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-unlisten", + "markdownDescription": "Enables the unlisten command without any pre-configured scope." + }, + { + "description": "Denies the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit", + "markdownDescription": "Denies the emit command without any pre-configured scope." + }, + { + "description": "Denies the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit-to", + "markdownDescription": "Denies the emit_to command without any pre-configured scope." + }, + { + "description": "Denies the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-listen", + "markdownDescription": "Denies the listen command without any pre-configured scope." + }, + { + "description": "Denies the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-unlisten", + "markdownDescription": "Denies the unlisten command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", + "type": "string", + "const": "core:image:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" + }, + { + "description": "Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-bytes", + "markdownDescription": "Enables the from_bytes command without any pre-configured scope." + }, + { + "description": "Enables the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-path", + "markdownDescription": "Enables the from_path command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-rgba", + "markdownDescription": "Enables the rgba command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-bytes", + "markdownDescription": "Denies the from_bytes command without any pre-configured scope." + }, + { + "description": "Denies the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-path", + "markdownDescription": "Denies the from_path command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-rgba", + "markdownDescription": "Denies the rgba command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", + "type": "string", + "const": "core:menu:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" + }, + { + "description": "Enables the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-append", + "markdownDescription": "Enables the append command without any pre-configured scope." + }, + { + "description": "Enables the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-create-default", + "markdownDescription": "Enables the create_default command without any pre-configured scope." + }, + { + "description": "Enables the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-get", + "markdownDescription": "Enables the get command without any pre-configured scope." + }, + { + "description": "Enables the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-insert", + "markdownDescription": "Enables the insert command without any pre-configured scope." + }, + { + "description": "Enables the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-checked", + "markdownDescription": "Enables the is_checked command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-items", + "markdownDescription": "Enables the items command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-popup", + "markdownDescription": "Enables the popup command without any pre-configured scope." + }, + { + "description": "Enables the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-prepend", + "markdownDescription": "Enables the prepend command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove-at", + "markdownDescription": "Enables the remove_at command without any pre-configured scope." + }, + { + "description": "Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-accelerator", + "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." + }, + { + "description": "Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-app-menu", + "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-help-menu-for-nsapp", + "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-window-menu", + "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-windows-menu-for-nsapp", + "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-checked", + "markdownDescription": "Enables the set_checked command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-text", + "markdownDescription": "Enables the set_text command without any pre-configured scope." + }, + { + "description": "Enables the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-text", + "markdownDescription": "Enables the text command without any pre-configured scope." + }, + { + "description": "Denies the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-append", + "markdownDescription": "Denies the append command without any pre-configured scope." + }, + { + "description": "Denies the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-create-default", + "markdownDescription": "Denies the create_default command without any pre-configured scope." + }, + { + "description": "Denies the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-get", + "markdownDescription": "Denies the get command without any pre-configured scope." + }, + { + "description": "Denies the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-insert", + "markdownDescription": "Denies the insert command without any pre-configured scope." + }, + { + "description": "Denies the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-checked", + "markdownDescription": "Denies the is_checked command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-items", + "markdownDescription": "Denies the items command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-popup", + "markdownDescription": "Denies the popup command without any pre-configured scope." + }, + { + "description": "Denies the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-prepend", + "markdownDescription": "Denies the prepend command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove-at", + "markdownDescription": "Denies the remove_at command without any pre-configured scope." + }, + { + "description": "Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-accelerator", + "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." + }, + { + "description": "Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-app-menu", + "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-help-menu-for-nsapp", + "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-window-menu", + "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-windows-menu-for-nsapp", + "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-checked", + "markdownDescription": "Denies the set_checked command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-text", + "markdownDescription": "Denies the set_text command without any pre-configured scope." + }, + { + "description": "Denies the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-text", + "markdownDescription": "Denies the text command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", + "type": "string", + "const": "core:path:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" + }, + { + "description": "Enables the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-basename", + "markdownDescription": "Enables the basename command without any pre-configured scope." + }, + { + "description": "Enables the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-dirname", + "markdownDescription": "Enables the dirname command without any pre-configured scope." + }, + { + "description": "Enables the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-extname", + "markdownDescription": "Enables the extname command without any pre-configured scope." + }, + { + "description": "Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-is-absolute", + "markdownDescription": "Enables the is_absolute command without any pre-configured scope." + }, + { + "description": "Enables the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-join", + "markdownDescription": "Enables the join command without any pre-configured scope." + }, + { + "description": "Enables the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-normalize", + "markdownDescription": "Enables the normalize command without any pre-configured scope." + }, + { + "description": "Enables the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve", + "markdownDescription": "Enables the resolve command without any pre-configured scope." + }, + { + "description": "Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve-directory", + "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." + }, + { + "description": "Denies the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-basename", + "markdownDescription": "Denies the basename command without any pre-configured scope." + }, + { + "description": "Denies the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-dirname", + "markdownDescription": "Denies the dirname command without any pre-configured scope." + }, + { + "description": "Denies the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-extname", + "markdownDescription": "Denies the extname command without any pre-configured scope." + }, + { + "description": "Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-is-absolute", + "markdownDescription": "Denies the is_absolute command without any pre-configured scope." + }, + { + "description": "Denies the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-join", + "markdownDescription": "Denies the join command without any pre-configured scope." + }, + { + "description": "Denies the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-normalize", + "markdownDescription": "Denies the normalize command without any pre-configured scope." + }, + { + "description": "Denies the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve", + "markdownDescription": "Denies the resolve command without any pre-configured scope." + }, + { + "description": "Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve-directory", + "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", + "type": "string", + "const": "core:resources:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`", + "type": "string", + "const": "core:tray:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`" + }, + { + "description": "Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-get-by-id", + "markdownDescription": "Enables the get_by_id command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-remove-by-id", + "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-as-template", + "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-menu", + "markdownDescription": "Enables the set_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-show-menu-on-left-click", + "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-temp-dir-path", + "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-tooltip", + "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." + }, + { + "description": "Enables the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-visible", + "markdownDescription": "Enables the set_visible command without any pre-configured scope." + }, + { + "description": "Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-get-by-id", + "markdownDescription": "Denies the get_by_id command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-remove-by-id", + "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-as-template", + "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-menu", + "markdownDescription": "Denies the set_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-show-menu-on-left-click", + "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-temp-dir-path", + "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-tooltip", + "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." + }, + { + "description": "Denies the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-visible", + "markdownDescription": "Denies the set_visible command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", + "type": "string", + "const": "core:webview:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" + }, + { + "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-clear-all-browsing-data", + "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Enables the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview", + "markdownDescription": "Enables the create_webview command without any pre-configured scope." + }, + { + "description": "Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview-window", + "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." + }, + { + "description": "Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-get-all-webviews", + "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-internal-toggle-devtools", + "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Enables the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-print", + "markdownDescription": "Enables the print command without any pre-configured scope." + }, + { + "description": "Enables the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-reparent", + "markdownDescription": "Enables the reparent command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-auto-resize", + "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-background-color", + "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-focus", + "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-position", + "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-size", + "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-zoom", + "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Enables the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-close", + "markdownDescription": "Enables the webview_close command without any pre-configured scope." + }, + { + "description": "Enables the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-hide", + "markdownDescription": "Enables the webview_hide command without any pre-configured scope." + }, + { + "description": "Enables the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-position", + "markdownDescription": "Enables the webview_position command without any pre-configured scope." + }, + { + "description": "Enables the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-show", + "markdownDescription": "Enables the webview_show command without any pre-configured scope." + }, + { + "description": "Enables the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-size", + "markdownDescription": "Enables the webview_size command without any pre-configured scope." + }, + { + "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-clear-all-browsing-data", + "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Denies the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview", + "markdownDescription": "Denies the create_webview command without any pre-configured scope." + }, + { + "description": "Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview-window", + "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." + }, + { + "description": "Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-get-all-webviews", + "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-internal-toggle-devtools", + "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Denies the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-print", + "markdownDescription": "Denies the print command without any pre-configured scope." + }, + { + "description": "Denies the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-reparent", + "markdownDescription": "Denies the reparent command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-auto-resize", + "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-background-color", + "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-focus", + "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-position", + "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-size", + "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-zoom", + "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Denies the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-close", + "markdownDescription": "Denies the webview_close command without any pre-configured scope." + }, + { + "description": "Denies the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-hide", + "markdownDescription": "Denies the webview_hide command without any pre-configured scope." + }, + { + "description": "Denies the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-position", + "markdownDescription": "Denies the webview_position command without any pre-configured scope." + }, + { + "description": "Denies the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-show", + "markdownDescription": "Denies the webview_show command without any pre-configured scope." + }, + { + "description": "Denies the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-size", + "markdownDescription": "Denies the webview_size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`", + "type": "string", + "const": "core:window:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`" + }, + { + "description": "Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-available-monitors", + "markdownDescription": "Enables the available_monitors command without any pre-configured scope." + }, + { + "description": "Enables the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-center", + "markdownDescription": "Enables the center command without any pre-configured scope." + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-current-monitor", + "markdownDescription": "Enables the current_monitor command without any pre-configured scope." + }, + { + "description": "Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-cursor-position", + "markdownDescription": "Enables the cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-destroy", + "markdownDescription": "Enables the destroy command without any pre-configured scope." + }, + { + "description": "Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-get-all-windows", + "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." + }, + { + "description": "Enables the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-hide", + "markdownDescription": "Enables the hide command without any pre-configured scope." + }, + { + "description": "Enables the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-position", + "markdownDescription": "Enables the inner_position command without any pre-configured scope." + }, + { + "description": "Enables the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-size", + "markdownDescription": "Enables the inner_size command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-internal-toggle-maximize", + "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-always-on-top", + "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-closable", + "markdownDescription": "Enables the is_closable command without any pre-configured scope." + }, + { + "description": "Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-decorated", + "markdownDescription": "Enables the is_decorated command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-focused", + "markdownDescription": "Enables the is_focused command without any pre-configured scope." + }, + { + "description": "Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-fullscreen", + "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximizable", + "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximized", + "markdownDescription": "Enables the is_maximized command without any pre-configured scope." + }, + { + "description": "Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimizable", + "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimized", + "markdownDescription": "Enables the is_minimized command without any pre-configured scope." + }, + { + "description": "Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-resizable", + "markdownDescription": "Enables the is_resizable command without any pre-configured scope." + }, + { + "description": "Enables the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-visible", + "markdownDescription": "Enables the is_visible command without any pre-configured scope." + }, + { + "description": "Enables the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-maximize", + "markdownDescription": "Enables the maximize command without any pre-configured scope." + }, + { + "description": "Enables the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-minimize", + "markdownDescription": "Enables the minimize command without any pre-configured scope." + }, + { + "description": "Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-monitor-from-point", + "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Enables the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-position", + "markdownDescription": "Enables the outer_position command without any pre-configured scope." + }, + { + "description": "Enables the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-size", + "markdownDescription": "Enables the outer_size command without any pre-configured scope." + }, + { + "description": "Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-primary-monitor", + "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." + }, + { + "description": "Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-request-user-attention", + "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." + }, + { + "description": "Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scale-factor", + "markdownDescription": "Enables the scale_factor command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-bottom", + "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-top", + "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-background-color", + "markdownDescription": "Enables the set_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-count", + "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-label", + "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." + }, + { + "description": "Enables the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-closable", + "markdownDescription": "Enables the set_closable command without any pre-configured scope." + }, + { + "description": "Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-content-protected", + "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-grab", + "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-icon", + "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-position", + "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-visible", + "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-decorations", + "markdownDescription": "Enables the set_decorations command without any pre-configured scope." + }, + { + "description": "Enables the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-effects", + "markdownDescription": "Enables the set_effects command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focus", + "markdownDescription": "Enables the set_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focusable", + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." + }, + { + "description": "Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-fullscreen", + "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-ignore-cursor-events", + "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-max-size", + "markdownDescription": "Enables the set_max_size command without any pre-configured scope." + }, + { + "description": "Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-maximizable", + "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-min-size", + "markdownDescription": "Enables the set_min_size command without any pre-configured scope." + }, + { + "description": "Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-minimizable", + "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-overlay-icon", + "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-position", + "markdownDescription": "Enables the set_position command without any pre-configured scope." + }, + { + "description": "Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-progress-bar", + "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-resizable", + "markdownDescription": "Enables the set_resizable command without any pre-configured scope." + }, + { + "description": "Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-shadow", + "markdownDescription": "Enables the set_shadow command without any pre-configured scope." + }, + { + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-simple-fullscreen", + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size", + "markdownDescription": "Enables the set_size command without any pre-configured scope." + }, + { + "description": "Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size-constraints", + "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-skip-taskbar", + "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Enables the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-theme", + "markdownDescription": "Enables the set_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title-bar-style", + "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-visible-on-all-workspaces", + "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Enables the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-show", + "markdownDescription": "Enables the show command without any pre-configured scope." + }, + { + "description": "Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-dragging", + "markdownDescription": "Enables the start_dragging command without any pre-configured scope." + }, + { + "description": "Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-resize-dragging", + "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Enables the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-theme", + "markdownDescription": "Enables the theme command without any pre-configured scope." + }, + { + "description": "Enables the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-title", + "markdownDescription": "Enables the title command without any pre-configured scope." + }, + { + "description": "Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-toggle-maximize", + "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unmaximize", + "markdownDescription": "Enables the unmaximize command without any pre-configured scope." + }, + { + "description": "Enables the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unminimize", + "markdownDescription": "Enables the unminimize command without any pre-configured scope." + }, + { + "description": "Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-available-monitors", + "markdownDescription": "Denies the available_monitors command without any pre-configured scope." + }, + { + "description": "Denies the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-center", + "markdownDescription": "Denies the center command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-current-monitor", + "markdownDescription": "Denies the current_monitor command without any pre-configured scope." + }, + { + "description": "Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-cursor-position", + "markdownDescription": "Denies the cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-destroy", + "markdownDescription": "Denies the destroy command without any pre-configured scope." + }, + { + "description": "Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-get-all-windows", + "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." + }, + { + "description": "Denies the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-hide", + "markdownDescription": "Denies the hide command without any pre-configured scope." + }, + { + "description": "Denies the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-position", + "markdownDescription": "Denies the inner_position command without any pre-configured scope." + }, + { + "description": "Denies the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-size", + "markdownDescription": "Denies the inner_size command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-internal-toggle-maximize", + "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-always-on-top", + "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-closable", + "markdownDescription": "Denies the is_closable command without any pre-configured scope." + }, + { + "description": "Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-decorated", + "markdownDescription": "Denies the is_decorated command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-focused", + "markdownDescription": "Denies the is_focused command without any pre-configured scope." + }, + { + "description": "Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-fullscreen", + "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximizable", + "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximized", + "markdownDescription": "Denies the is_maximized command without any pre-configured scope." + }, + { + "description": "Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimizable", + "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimized", + "markdownDescription": "Denies the is_minimized command without any pre-configured scope." + }, + { + "description": "Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-resizable", + "markdownDescription": "Denies the is_resizable command without any pre-configured scope." + }, + { + "description": "Denies the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-visible", + "markdownDescription": "Denies the is_visible command without any pre-configured scope." + }, + { + "description": "Denies the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-maximize", + "markdownDescription": "Denies the maximize command without any pre-configured scope." + }, + { + "description": "Denies the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-minimize", + "markdownDescription": "Denies the minimize command without any pre-configured scope." + }, + { + "description": "Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-monitor-from-point", + "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Denies the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-position", + "markdownDescription": "Denies the outer_position command without any pre-configured scope." + }, + { + "description": "Denies the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-size", + "markdownDescription": "Denies the outer_size command without any pre-configured scope." + }, + { + "description": "Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-primary-monitor", + "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." + }, + { + "description": "Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-request-user-attention", + "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." + }, + { + "description": "Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scale-factor", + "markdownDescription": "Denies the scale_factor command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-bottom", + "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-top", + "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-background-color", + "markdownDescription": "Denies the set_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-count", + "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-label", + "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." + }, + { + "description": "Denies the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-closable", + "markdownDescription": "Denies the set_closable command without any pre-configured scope." + }, + { + "description": "Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-content-protected", + "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-grab", + "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-icon", + "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-position", + "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-visible", + "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-decorations", + "markdownDescription": "Denies the set_decorations command without any pre-configured scope." + }, + { + "description": "Denies the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-effects", + "markdownDescription": "Denies the set_effects command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focus", + "markdownDescription": "Denies the set_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focusable", + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." + }, + { + "description": "Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-fullscreen", + "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-ignore-cursor-events", + "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-max-size", + "markdownDescription": "Denies the set_max_size command without any pre-configured scope." + }, + { + "description": "Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-maximizable", + "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-min-size", + "markdownDescription": "Denies the set_min_size command without any pre-configured scope." + }, + { + "description": "Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-minimizable", + "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-overlay-icon", + "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-position", + "markdownDescription": "Denies the set_position command without any pre-configured scope." + }, + { + "description": "Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-progress-bar", + "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-resizable", + "markdownDescription": "Denies the set_resizable command without any pre-configured scope." + }, + { + "description": "Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-shadow", + "markdownDescription": "Denies the set_shadow command without any pre-configured scope." + }, + { + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-simple-fullscreen", + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size", + "markdownDescription": "Denies the set_size command without any pre-configured scope." + }, + { + "description": "Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size-constraints", + "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-skip-taskbar", + "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Denies the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-theme", + "markdownDescription": "Denies the set_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title-bar-style", + "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-visible-on-all-workspaces", + "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Denies the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-show", + "markdownDescription": "Denies the show command without any pre-configured scope." + }, + { + "description": "Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-dragging", + "markdownDescription": "Denies the start_dragging command without any pre-configured scope." + }, + { + "description": "Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-resize-dragging", + "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Denies the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-theme", + "markdownDescription": "Denies the theme command without any pre-configured scope." + }, + { + "description": "Denies the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-title", + "markdownDescription": "Denies the title command without any pre-configured scope." + }, + { + "description": "Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-toggle-maximize", + "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unmaximize", + "markdownDescription": "Denies the unmaximize command without any pre-configured scope." + }, + { + "description": "Denies the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unminimize", + "markdownDescription": "Denies the unminimize command without any pre-configured scope." + }, + { + "description": "Allows the log command\n#### This default permission set includes:\n\n- `allow-log`", + "type": "string", + "const": "log:default", + "markdownDescription": "Allows the log command\n#### This default permission set includes:\n\n- `allow-log`" + }, + { + "description": "Enables the log command without any pre-configured scope.", + "type": "string", + "const": "log:allow-log", + "markdownDescription": "Enables the log command without any pre-configured scope." + }, + { + "description": "Denies the log command without any pre-configured scope.", + "type": "string", + "const": "log:deny-log", + "markdownDescription": "Denies the log 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/src-backend/run_err.txt b/src-backend/run_err.txt new file mode 100644 index 0000000..1a4d49e --- /dev/null +++ b/src-backend/run_err.txt @@ -0,0 +1,306 @@ + Compiling telos-db v0.2.0 (D:\develop\TelosDB\src-backend) +warning: variable does not need to be mutable + --> src\lib.rs:380:9 + | +380 | let mut model_path = base_dir.join("models").join("embeddinggemma-300m-q4_0.gguf"); + | ----^^^^^^^^^^ + | | + | help: remove this `mut` + | + = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default + +warning: `telos-db` (lib) generated 1 warning (run `cargo fix --lib -p telos-db` to apply 1 suggestion) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 13.48s + Running `../target\debug\telos-db.exe` +[2026-02-12][14:52:29][telos_db_lib][INFO] Application starting (Tauri 2)... +[2026-02-12][14:52:29][telos_db_lib][INFO] --- [DIAGNOSIS] Environment Check Start --- +[2026-02-12][14:52:29][telos_db_lib][INFO] Found build_assets in resource_dir: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:29][telos_db_lib][INFO] 笨・build_assets found at: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:29][telos_db_lib][INFO] Found build_assets in resource_dir: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:29][telos_db_lib][INFO] 笨・found mcp.json: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets\\mcp.json" +[2026-02-12][14:52:29][telos_db_lib][INFO] Found build_assets in resource_dir: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:29][telos_db_lib][INFO] 笨・found config.json: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets\\config.json" +[2026-02-12][14:52:29][telos_db_lib][INFO] Found build_assets in resource_dir: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:29][telos_db_lib][INFO] 笨・found vector.dll: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets\\vector.dll" +[2026-02-12][14:52:29][telos_db_lib][INFO] Found build_assets in resource_dir: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:29][telos_db_lib][INFO] 笨・found llama.dll: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets\\llama.dll" +[2026-02-12][14:52:29][telos_db_lib][INFO] Found build_assets in resource_dir: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:29][telos_db_lib][INFO] 笨・models directory exists at: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets\\models" +[2026-02-12][14:52:29][telos_db_lib][INFO] --- [DIAGNOSIS] Environment Check End --- +[2026-02-12][14:52:29][telos_db_lib][INFO] Found build_assets in resource_dir: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:29][telos_db_lib][INFO] Updated process PATH with build_assets: D:\develop\TelosDB\target\debug\build_assets;D:\develop\TelosDB\src-backend\../target\debug\build\libsqlite3-sys-7a2250f017bc8218\out;D:\develop\TelosDB\src-backend\../target\debug\build\ring-9ad729c3977df67a\out;D:\develop\TelosDB\src-backend\../target\debug\build\vswhom-sys-58c99b46f6890f66\out;D:\develop\TelosDB\src-backend\../target\debug\build\webview2-com-sys-889cb3fd622ff5aa\out\x64;D:\develop\TelosDB\src-backend\../target\debug;D:\develop\TelosDB\src-backend\../target\debug\deps;C:\Users\bythe\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib;C:\Program Files\PowerShell\7;c:\Users\bythe\.antigravity\extensions\vadimcn.vscode-lldb-1.12.1\bin;C:\Users\bythe\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\libnvvp;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.9\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.9\libnvvp;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6\libnvvp;C:\Python312\Scripts\;C:\Python312\;C:\Program Files\Eclipse Adoptium\jdk-17.0.8.7-hotspot\bin;C:\Python311\Scripts\;C:\Python311\;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\libnvvp;C:\Program Files (x86)\Common Files\Intel\Shared Files\cpp\bin\Intel64;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\libnvvp;C:\Python39\Scripts\;C:\Python39\;C:\Program Files\AdoptOpenJDK\jdk-11.0.5.10-hotspot\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;c:\maven\bin;C:\platform-tools;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Fi;C:\Program Files\dotnet\;C:\Program Files\Git\cmd;C:\Program Files\TortoiseGit\bin;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\Docker\Docker\resources\bin;C:\Program Files\nodejs\;C:\Program Files\NVIDIA Corporation\Nsight Compute 2022.3.0\;C:\Program Files\PowerShell\7\;C:\Users\bythe\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\25\bin;C:\Users\bythe\.cargo\bin;C:\Users\bythe\AppData\Local\Microsoft\WindowsApps;C:\Users\bythe\AppData\Roaming\Composer\vendor\bin;C:\Users\bythe\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\bythe\.dotnet\tools;C:\Users\bythe\AppData\Local\GitHubDesktop\bin;C:\ProgramData\bythe\GitHubDesktop\bin;C:\Users\bythe\.deno\bin;C:\Users\bythe\AppData\Roaming\nvm;C:\Program Files\nodejs;C:\Users\bythe\AppData\Local\Programs\Ollama;C:\Users\bythe\AppData\Local\Microsoft\WindowsApps;D:\ComfyUI_windows_portable\python_embeded\Scripts;C:\Users\bythe\.dotnet\tools;C:\Users\bythe\AppData\Roaming\npm;C:\Users\bythe\AppData\Local\Programs\cursor\resources\app\bin;C:\Users\bythe\AppData\Local\Programs\Antigravity\bin;C:\Users\bythe\AppData\Local\Microsoft\WinGet\Packages\zig.zig_Microsoft.Winget.Source_8wekyb3d8bbwe\zig-x86_64-windows-0.15.2;;C:\Users\bythe\.lmstudio\bin;C:\Users\bythe\AppData\Local\PowerToys\DSCModules\;C:\Users\bythe\.rustup\toolchains\stable-x86_64-pc-windows-msvc\bin +[2026-02-12][14:52:29][telos_db_lib][INFO] Found build_assets in resource_dir: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:29][telos_db_lib][INFO] Checking config.json at resolved path: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets\\config.json" +[2026-02-12][14:52:29][telos_db_lib][INFO] Found build_assets in resource_dir: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:29][telos_db_lib][INFO] Verified DLL exists: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets\\llama.dll" +[2026-02-12][14:52:29][telos_db_lib][INFO] Verified DLL exists: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets\\ggml.dll" +[2026-02-12][14:52:29][telos_db_lib][INFO] Using base_dir for sidecar: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:29][telos_db_lib][INFO] Using model path for sidecar: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets\\models\\embeddinggemma-300m-q4_0.gguf" +[2026-02-12][14:52:29][telos_db_lib][INFO] Setting Sidecar PATH: D:\develop\TelosDB\target\debug\build_assets;D:\develop\TelosDB\target\debug\bin;D:\develop\TelosDB\target\debug\build_assets;D:\develop\TelosDB\src-backend\../target\debug\build\libsqlite3-sys-7a2250f017bc8218\out;D:\develop\TelosDB\src-backend\../target\debug\build\ring-9ad729c3977df67a\out;D:\develop\TelosDB\src-backend\../target\debug\build\vswhom-sys-58c99b46f6890f66\out;D:\develop\TelosDB\src-backend\../target\debug\build\webview2-com-sys-889cb3fd622ff5aa\out\x64;D:\develop\TelosDB\src-backend\../target\debug;D:\develop\TelosDB\src-backend\../target\debug\deps;C:\Users\bythe\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib;C:\Program Files\PowerShell\7;c:\Users\bythe\.antigravity\extensions\vadimcn.vscode-lldb-1.12.1\bin;C:\Users\bythe\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\17\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\libnvvp;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.9\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.9\libnvvp;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6\libnvvp;C:\Python312\Scripts\;C:\Python312\;C:\Program Files\Eclipse Adoptium\jdk-17.0.8.7-hotspot\bin;C:\Python311\Scripts\;C:\Python311\;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\libnvvp;C:\Program Files (x86)\Common Files\Intel\Shared Files\cpp\bin\Intel64;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\libnvvp;C:\Python39\Scripts\;C:\Python39\;C:\Program Files\AdoptOpenJDK\jdk-11.0.5.10-hotspot\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;c:\maven\bin;C:\platform-tools;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Fi;C:\Program Files\dotnet\;C:\Program Files\Git\cmd;C:\Program Files\TortoiseGit\bin;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\Docker\Docker\resources\bin;C:\Program Files\nodejs\;C:\Program Files\NVIDIA Corporation\Nsight Compute 2022.3.0\;C:\Program Files\PowerShell\7\;C:\Users\bythe\AppData\Roaming\Code\User\globalStorage\pleiades.java-extension-pack-jdk\java\25\bin;C:\Users\bythe\.cargo\bin;C:\Users\bythe\AppData\Local\Microsoft\WindowsApps;C:\Users\bythe\AppData\Roaming\Composer\vendor\bin;C:\Users\bythe\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\bythe\.dotnet\tools;C:\Users\bythe\AppData\Local\GitHubDesktop\bin;C:\ProgramData\bythe\GitHubDesktop\bin;C:\Users\bythe\.deno\bin;C:\Users\bythe\AppData\Roaming\nvm;C:\Program Files\nodejs;C:\Users\bythe\AppData\Local\Programs\Ollama;C:\Users\bythe\AppData\Local\Microsoft\WindowsApps;D:\ComfyUI_windows_portable\python_embeded\Scripts;C:\Users\bythe\.dotnet\tools;C:\Users\bythe\AppData\Roaming\npm;C:\Users\bythe\AppData\Local\Programs\cursor\resources\app\bin;C:\Users\bythe\AppData\Local\Programs\Antigravity\bin;C:\Users\bythe\AppData\Local\Microsoft\WinGet\Packages\zig.zig_Microsoft.Winget.Source_8wekyb3d8bbwe\zig-x86_64-windows-0.15.2;;C:\Users\bythe\.lmstudio\bin;C:\Users\bythe\AppData\Local\PowerToys\DSCModules\;C:\Users\bythe\.rustup\toolchains\stable-x86_64-pc-windows-msvc\bin +llama-server started (Sidecar) +[2026-02-12][14:52:30][telos_db_lib][INFO] Found build_assets in resource_dir: "\\\\?\\D:\\develop\\TelosDB\\target\\debug\\build_assets" +[2026-02-12][14:52:30][telos_db_lib][INFO] DB Path: D:\develop\TelosDB\data/vector.db, Ext Path: \\?\D:\develop\TelosDB\target\debug\build_assets\vector.dll +[2026-02-12][14:52:30][telos_db_lib::db][INFO] Loading SQLite extension from: D:\develop\TelosDB\target\debug\build_assets\vector.dll + +thread 'sqlx-sqlite-worker-0' (11756) panicked at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\sqlx-sqlite-0.8.6\src\connection\establish.rs:243:40: +expected error code to be set in current context +stack backtrace: +llama-server error: load_backend: loaded RPC backend from D:\develop\TelosDB\target\debug\build_assets\ggml-rpc.dll + + 0: std::panicking::panic_handler + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\std\src\panicking.rs:689 + 1: core::panicking::panic_fmt + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\core\src\panicking.rs:80 + 2: core::panicking::panic_display + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\core\src\panicking.rs:259 + 3: core::option::expect_failed + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\core\src\option.rs:2184 + 4: enum2$ >::expect + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\option.rs:971 + 5: sqlx_sqlite::connection::handle::ConnectionHandle::expect_error + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\sqlx-sqlite-0.8.6\src\connection\handle.rs:57 + 6: sqlx_sqlite::connection::establish::EstablishParams::establish + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\sqlx-sqlite-0.8.6\src\connection\establish.rs:243 + 7: sqlx_sqlite::connection::worker::impl$1::establish::async_fn$0::closure$0 + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\sqlx-sqlite-0.8.6\src\connection\worker.rs:111 + 8: core::hint::black_box + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\hint.rs:473 +note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. +llama-server error: ggml_vulkan: Found 1 Vulkan devices: + +llama-server error: ggml_vulkan: 0 = NVIDIA GeForce RTX 3060 (NVIDIA) | uma: 0 | fp16: 1 | bf16: 0 | warp size: 32 | shared memory: 49152 | int dot: 1 | matrix cores: NV_coopmat2 + +llama-server error: load_backend: loaded Vulkan backend from D:\develop\TelosDB\target\debug\build_assets\ggml-vulkan.dll + + +thread 'main' (344) panicked at src\lib.rs:499:76: +Failed to init db: attempted to communicate with a crashed background worker + +Stack backtrace: + 0: std::backtrace_rs::backtrace::win64::trace + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\std\src\..\..\backtrace\src\backtrace\win64.rs:85 + 1: std::backtrace_rs::backtrace::trace_unsynchronized + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66 + 2: std::backtrace::Backtrace::create + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\std\src\backtrace.rs:331 + 3: std::backtrace::Backtrace::capture + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\std\src\backtrace.rs:296 + 4: anyhow::error::impl$1::from > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\anyhow-1.0.101\src\backtrace.rs:27 + 5: core::result::impl$28::from_residual,enum2$,anyhow::Error> + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\result.rs:2189 + 6: telos_db_lib::db::init_db::async_fn$0 + at .\src\db.rs:22 + 7: telos_db_lib::run::closure$1::async_block$0 + at .\src\lib.rs:499 + 8: core::future::future::impl$1::poll,alloc::alloc::Global> > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\future\future.rs:133 + 9: tokio::runtime::park::impl$4::block_on::closure$0,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\park.rs:284 + 10: tokio::task::coop::with_budget + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\task\coop\mod.rs:167 + 11: tokio::task::coop::budget + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\task\coop\mod.rs:133 + 12: tokio::runtime::park::CachedParkThread::block_on,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\park.rs:284 + 13: tokio::runtime::context::blocking::BlockingRegionGuard::block_on,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\context\blocking.rs:66 + 14: tokio::runtime::scheduler::multi_thread::impl$0::block_on::closure$0,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\scheduler\multi_thread\mod.rs:89 + 15: tokio::runtime::context::runtime::enter_runtime,alloc::alloc::Global> > >,tuple$<> > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\context\runtime.rs:65 + 16: tokio::runtime::scheduler::multi_thread::MultiThread::block_on,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\scheduler\multi_thread\mod.rs:88 + 17: tokio::runtime::runtime::Runtime::block_on_inner,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\runtime.rs:370 + 18: tokio::runtime::runtime::Runtime::block_on > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\runtime.rs:340 + 19: enum2$::block_on > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\async_runtime.rs:126 + 20: tauri::async_runtime::GlobalRuntime::block_on > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\async_runtime.rs:71 + 21: tauri::async_runtime::block_on > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\async_runtime.rs:264 + 22: telos_db_lib::run::closure$1 + at .\src\lib.rs:493 + 23: core::ops::function::FnOnce::call_once > > > > > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\ops\function.rs:250 + 24: alloc::boxed::impl$31::call_once > > > >,dyn$ > > > >, + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\alloc\src\boxed.rs:2206 + 25: tauri::app::setup > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:2380 + 26: tauri::app::impl$16::make_run_event_loop_callback::closure$0 >,tauri::app::impl$19::run::closure_env$0 > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:1298 + 27: tauri_runtime_wry::handle_event_loop > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-runtime-wry-2.10.0\src\lib.rs:4035 + 28: tauri_runtime_wry::make_event_handler::closure$0,tauri::app::impl$16::make_run_event_loop_callback::closure_env$0 >,tauri::app::impl$19::run::closure_env$0 > >,tauri_runtime_wry::make_event_handler::closure_env$0,tauri::app::impl$16::make_run + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop.rs:246 + 30: alloc::boxed::impl$32::call_mut > > > >,ref_mut$ > >,dyn$ > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:250 + 32: core::panic::unwind_safe::impl$25::call_once,tao::platform_impl::platform::event_loop::runner::impl$3::call_event_handler::closure_env$0 > > > > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\panic\unwind_safe.rs:274 + 33: std::panicking::catch_unwind::do_call > > > >,tuple$<> + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\std\src\panicking.rs:581 + 34: crossbeam_channel::flavors::list::impl$4::drop,enum2$ > > > + 35: std::panicking::catch_unwind + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\std\src\panicking.rs:544 + 36: std::panic::catch_unwind > > > >,tuple$<> > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\std\src\panic.rs:359 + 37: tao::platform_impl::platform::event_loop::runner::EventLoopRunner > > >::catch_unwind > >,tuple$<>,tao::platform_impl::platf + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:156 + 38: tao::platform_impl::platform::event_loop::runner::EventLoopRunner > > >::call_event_handler > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:242 + 39: tao::platform_impl::platform::event_loop::runner::EventLoopRunner > > >::call_new_events > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:396 + 40: tao::platform_impl::platform::event_loop::runner::EventLoopRunner > > >::move_state_to > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:310 + 41: tao::platform_impl::platform::event_loop::runner::EventLoopRunner > > >::poll > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:205 + 42: tao::platform_impl::platform::event_loop::EventLoop > > >::run_return > >,tauri_runtime_wry::make_event_handler::closure_env + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop.rs:255 + 43: tao::platform_impl::platform::event_loop::EventLoop > > >::run > >,tauri_runtime_wry::make_event_handler::closure_env$0 > > >::run > >,tauri_runtime_wry::make_event_handler::closure_env$0,tauri::app::impl$16::make_run_event_loop_callback::closure_env$0 >,tauri::app::impl$19::run::closure_env$0 > >::run >,tauri::app::impl$19::run::closure_env$0 > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:1247 + 47: tauri::app::Builder > >::run > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:2299 + 48: telos_db_lib::run + at .\src\lib.rs:552 + 49: telos_db::main + at .\src\main.rs:5 + 50: core::ops::function::FnOnce::call_once > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\ops\function.rs:250 + 51: core::hint::black_box + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\hint.rs:473 + 52: std::sys::backtrace::__rust_begin_short_backtrace > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\std\src\sys\backtrace.rs:160 + 53: std::rt::lang_start::closure$0 > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\std\src\rt.rs:206 + 54: std::rt::lang_start_internal::closure$0 + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\std\src\rt.rs:175 + 55: std::panicking::catch_unwind::do_call + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\std\src\panicking.rs:581 + 56: std::panicking::catch_unwind + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\std\src\panicking.rs:544 + 57: std::panic::catch_unwind + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\std\src\panic.rs:359 + 58: std::rt::lang_start_internal + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\std\src\rt.rs:171 + 59: std::rt::lang_start > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\std\src\rt.rs:205 + 60: main + 61: invoke_main + at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78 + 62: __scrt_common_main_seh + at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288 + 63: BaseThreadInitThunk + 64: RtlUserThreadStart +stack backtrace: + 0: std::panicking::panic_handler + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\std\src\panicking.rs:689 + 1: core::panicking::panic_fmt + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\core\src\panicking.rs:80 + 2: core::result::unwrap_failed + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library\core\src\result.rs:1867 + 3: enum2$,anyhow::Error> >::expect,anyhow::Error> + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\result.rs:1185 + 4: telos_db_lib::run::closure$1::async_block$0 + at .\src\lib.rs:499 + 5: core::future::future::impl$1::poll,alloc::alloc::Global> > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\future\future.rs:133 + 6: tokio::runtime::park::impl$4::block_on::closure$0,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\park.rs:284 + 7: tokio::task::coop::with_budget + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\task\coop\mod.rs:167 + 8: tokio::task::coop::budget + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\task\coop\mod.rs:133 + 9: tokio::runtime::park::CachedParkThread::block_on,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\park.rs:284 + 10: tokio::runtime::context::blocking::BlockingRegionGuard::block_on,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\context\blocking.rs:66 + 11: tokio::runtime::scheduler::multi_thread::impl$0::block_on::closure$0,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\scheduler\multi_thread\mod.rs:89 + 12: tokio::runtime::context::runtime::enter_runtime,alloc::alloc::Global> > >,tuple$<> > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\context\runtime.rs:65 + 13: tokio::runtime::scheduler::multi_thread::MultiThread::block_on,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\scheduler\multi_thread\mod.rs:88 + 14: tokio::runtime::runtime::Runtime::block_on_inner,alloc::alloc::Global> > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\runtime.rs:370 + 15: tokio::runtime::runtime::Runtime::block_on > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-1.49.0\src\runtime\runtime.rs:340 + 16: enum2$::block_on > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\async_runtime.rs:126 + 17: tauri::async_runtime::GlobalRuntime::block_on > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\async_runtime.rs:71 + 18: tauri::async_runtime::block_on > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\async_runtime.rs:264 + 19: telos_db_lib::run::closure$1 + at .\src\lib.rs:493 + 20: core::ops::function::FnOnce::call_once > > > > > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\ops\function.rs:250 + 21: alloc::boxed::impl$31::call_once > > > >,dyn$ > > > >, + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\alloc\src\boxed.rs:2206 + 22: tauri::app::setup > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:2380 + 23: tauri::app::impl$16::make_run_event_loop_callback::closure$0 >,tauri::app::impl$19::run::closure_env$0 > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:1298 + 24: tauri_runtime_wry::handle_event_loop > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-runtime-wry-2.10.0\src\lib.rs:4035 + 25: tauri_runtime_wry::make_event_handler::closure$0,tauri::app::impl$16::make_run_event_loop_callback::closure_env$0 >,tauri::app::impl$19::run::closure_env$0 > >,tauri_runtime_wry::make_event_handler::closure_env$0,tauri::app::impl$16::make_run + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop.rs:246 + 27: alloc::boxed::impl$32::call_mut > > > >,ref_mut$ > >,dyn$ > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:250 + 29: core::panic::unwind_safe::impl$25::call_once,tao::platform_impl::platform::event_loop::runner::impl$3::call_event_handler::closure_env$0 > > > > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\panic\unwind_safe.rs:274 + 30: std::panicking::catch_unwind::do_call > > > >,tuple$<> + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\std\src\panicking.rs:581 + 31: crossbeam_channel::flavors::list::impl$4::drop,enum2$ > > > + 32: std::panicking::catch_unwind + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\std\src\panicking.rs:544 + 33: std::panic::catch_unwind > > > >,tuple$<> > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\std\src\panic.rs:359 + 34: tao::platform_impl::platform::event_loop::runner::EventLoopRunner > > >::catch_unwind > >,tuple$<>,tao::platform_impl::platf + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:156 + 35: tao::platform_impl::platform::event_loop::runner::EventLoopRunner > > >::call_event_handler > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:242 + 36: tao::platform_impl::platform::event_loop::runner::EventLoopRunner > > >::call_new_events > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:396 + 37: tao::platform_impl::platform::event_loop::runner::EventLoopRunner > > >::move_state_to > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:310 + 38: tao::platform_impl::platform::event_loop::runner::EventLoopRunner > > >::poll > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop\runner.rs:205 + 39: tao::platform_impl::platform::event_loop::EventLoop > > >::run_return > >,tauri_runtime_wry::make_event_handler::closure_env + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tao-0.34.5\src\platform_impl\windows\event_loop.rs:255 + 40: tao::platform_impl::platform::event_loop::EventLoop > > >::run > >,tauri_runtime_wry::make_event_handler::closure_env$0 > > >::run > >,tauri_runtime_wry::make_event_handler::closure_env$0,tauri::app::impl$16::make_run_event_loop_callback::closure_env$0 >,tauri::app::impl$19::run::closure_env$0 > >::run >,tauri::app::impl$19::run::closure_env$0 > > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:1247 + 44: tauri::app::Builder > >::run > > + at C:\Users\bythe\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tauri-2.10.2\src\app.rs:2299 + 45: telos_db_lib::run + at .\src\lib.rs:552 + 46: telos_db::main + at .\src\main.rs:5 + 47: core::ops::function::FnOnce::call_once > + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\ops\function.rs:250 + 48: core::hint::black_box + at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c\library\core\src\hint.rs:473 +note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. +[0212/235230.342:ERROR:ui\gfx\win\window_impl.cc:124] Failed to unregister class Chrome_WidgetWin_0. Error = 1412 +error: process didn't exit successfully: `../target\debug\telos-db.exe` (exit code: 101) diff --git a/src-backend/src/db.rs b/src-backend/src/db.rs new file mode 100644 index 0000000..ab437f1 --- /dev/null +++ b/src-backend/src/db.rs @@ -0,0 +1,120 @@ +use sea_orm::{DatabaseConnection, SqlxSqliteConnector, ConnectionTrait, Statement, DatabaseBackend}; +use sea_orm::sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions}; +use std::str::FromStr; +use std::time::Duration; +use std::path::Path; + +pub async fn init_db(db_path: &str, extension_path: &str, vec_dim: usize) -> anyhow::Result { + let db_url = format!("sqlite:{}?mode=rwc", db_path); + + // Strip \\?\ prefix that causes issues with sqlite3_load_extension + let clean_ext_path = extension_path + .strip_prefix("\\\\?\\") + .unwrap_or(extension_path) + .to_string(); + + let static_ext_path: &'static str = Box::leak(clean_ext_path.into_boxed_str()); + log::info!("Checking SQLite extension at: {}", static_ext_path); + + // Check if the extension file exists + let ext_path = Path::new(static_ext_path); + if !ext_path.exists() { + log::error!("❌ Extension file not found: {}", static_ext_path); + return Err(anyhow::anyhow!("SQLite extension file not found: {}", static_ext_path)); + } + + // Also check for sqlite3.dll in the same directory (common dependency) + if let Some(parent) = ext_path.parent() { + let sqlite3_dll = parent.join("sqlite3.dll"); + if !sqlite3_dll.exists() { + log::warn!("⚠️ sqlite3.dll not found in the same directory as vector.dll. This might cause load failure."); + } else { + log::info!("✅ sqlite3.dll found alongside extension."); + } + } + + log::info!("Loading SQLite extension: {}", static_ext_path); + + let options = SqliteConnectOptions::from_str(&db_url)? + .create_if_missing(true) + // Note: We use the full path. If it fails, common causes are missing dependencies (sqlite3.dll, etc.) + .extension(static_ext_path); + + let pool = SqlitePoolOptions::new() + .max_connections(10) + .min_connections(5) + .acquire_timeout(Duration::from_secs(8)) + .max_lifetime(Duration::from_secs(8)) + .connect_with(options) + .await?; + + let db = SqlxSqliteConnector::from_sqlx_sqlite_pool(pool); + log::info!("Database connection established. Extension should be loaded via connect options."); + + // PRAGMA settings + let _ = db.execute(Statement::from_string( + DatabaseBackend::Sqlite, + "PRAGMA journal_mode = WAL;".to_string(), + )).await; + + // Schema Initialization + // 1. Standard items table + db.execute(Statement::from_string( + DatabaseBackend::Sqlite, + "CREATE TABLE IF NOT EXISTS items ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + content TEXT NOT NULL, + document_name TEXT, + created_at TEXT DEFAULT (datetime('now', 'localtime')), + updated_at TEXT DEFAULT (datetime('now', 'localtime')) + );".to_string(), + )).await?; + + // 2. Add embedding column to items (ALTER TABLE does not support IF NOT EXISTS in many sqlite versions) + // We attempt it and ignore errors if column exists + let _ = db.execute(Statement::from_string( + DatabaseBackend::Sqlite, + "ALTER TABLE items ADD COLUMN embedding BLOB;".to_string(), + )).await; + + // 3. Initialize vector engine for the column + match db.execute(Statement::from_string( + DatabaseBackend::Sqlite, + format!( + "SELECT vector_init('items', 'embedding', 'type=FLOAT32,dimension={}');", + vec_dim + ), + )).await { + Ok(_) => log::info!("vector_init succeeded for items.embedding (dim={})", vec_dim), + Err(e) => log::warn!("vector_init failed (may already be initialized): {}", e), + } + + // triggers + db.execute(Statement::from_string( + DatabaseBackend::Sqlite, + "CREATE TRIGGER IF NOT EXISTS update_items_updated_at + AFTER UPDATE ON items + FOR EACH ROW + BEGIN + UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; + END;".to_string(), + )).await?; + + Ok(db) +} + +#[cfg(test)] +mod tests { + use super::*; + use sea_orm::{ConnectOptions, Database}; + + #[tokio::test] + async fn test_init_db_basic() { + // NOTE: We test with a dummy extension path and expect it to fail if it's not found, + // or we test just the SeaORM part if we could separation. + // For now, let's just ensure we can connect to an in-memory sqlite via SeaORM. + let mut opt = ConnectOptions::new("sqlite::memory:"); + let db = Database::connect(opt).await; + assert!(db.is_ok()); + } +} diff --git a/src-backend/src/entities/items.rs b/src-backend/src/entities/items.rs new file mode 100644 index 0000000..6c0236b --- /dev/null +++ b/src-backend/src/entities/items.rs @@ -0,0 +1,21 @@ +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)] +#[sea_orm(table_name = "items")] +pub struct Model { + #[sea_orm(primary_key)] + pub id: i32, + pub content: String, + pub document_name: Option, + pub created_at: DateTimeLocal, + pub updated_at: DateTimeLocal, + #[sea_orm(column_type = "Blob", nullable)] + #[serde(skip_serializing_if = "Option::is_none")] + pub embedding: Option>, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/src-backend/src/entities/mod.rs b/src-backend/src/entities/mod.rs new file mode 100644 index 0000000..339b22d --- /dev/null +++ b/src-backend/src/entities/mod.rs @@ -0,0 +1 @@ +pub mod items; diff --git a/src-backend/src/lib.rs b/src-backend/src/lib.rs index 0c28255..6426a1e 100644 --- a/src-backend/src/lib.rs +++ b/src-backend/src/lib.rs @@ -9,14 +9,15 @@ use dotenvy::dotenv; use sea_orm::DatabaseConnection; use std::env; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use std::sync::Arc; use tauri::menu::{Menu, MenuItem}; use tauri::tray::{TrayIconBuilder, TrayIconEvent}; -use tauri::{Emitter, Manager}; +use tauri::Manager; use sea_orm::{ConnectionTrait, Statement, DatabaseBackend}; use std::sync::atomic::AtomicUsize; +use tauri::Emitter; pub struct AppState { pub db: DatabaseConnection, @@ -28,8 +29,6 @@ // --- Path Resolution Helpers --- -// --- Path Resolution Helpers --- - pub fn find_build_assets_dir_logic(res_dir: Option, exe_dir: Option) -> Option { // 1. Check Resource Dir (Release / Installed) - prioritizes nested structure if let Some(res_dir) = res_dir { @@ -75,7 +74,7 @@ } // 2. Critical Files Check - let critical_files = ["mcp.json", "config.json", "vec0.dll", "llama.dll"]; + let critical_files = ["mcp.json", "config.json", "vector.dll", "llama.dll"]; for file in critical_files { match resolve_resource_path(app_handle, file) { Some(p) if p.exists() => log::info!("✅ found {}: {:?}", file, p), @@ -139,373 +138,266 @@ async fn get_table_list(state: tauri::State<'_, Arc>) -> Result, String> { let results = state.db.query_all(Statement::from_string( DatabaseBackend::Sqlite, - "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'" + "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%';".to_string(), )).await.map_err(|e| e.to_string())?; - let mut tables = Vec::new(); - for res in results { - let name: String = res.try_get("", "name").map_err(|e| e.to_string())?; - tables.push(name); - } - Ok(tables) + Ok(results.into_iter().map(|r| r.try_get::("", "name").unwrap_or_default()).collect()) } #[tauri::command] -async fn get_table_schema(state: tauri::State<'_, Arc>, table_name: String) -> Result { - validate_table_name(&table_name)?; +async fn get_table_schema(state: tauri::State<'_, Arc>, table: String) -> Result { + validate_table_name(&table)?; + let query = format!("PRAGMA table_info({});", table); let results = state.db.query_all(Statement::from_string( DatabaseBackend::Sqlite, - format!("PRAGMA table_info({})", table_name) + query, )).await.map_err(|e| e.to_string())?; let mut schema = Vec::new(); - for res in results { + for row in results { schema.push(serde_json::json!({ - "cid": res.try_get::("", "cid").map_err(|e| e.to_string())?, - "name": res.try_get::("", "name").map_err(|e| e.to_string())?, - "type": res.try_get::("", "type").map_err(|e| e.to_string())?, - "notnull": res.try_get::("", "notnull").map_err(|e| e.to_string())?, - "dflt_value": res.try_get::>("", "dflt_value").map_err(|e| e.to_string())?, - "pk": res.try_get::("", "pk").map_err(|e| e.to_string())?, + "name": row.try_get::("", "name").unwrap_or_default(), + "type": row.try_get::("", "type").unwrap_or_default(), + "notnull": row.try_get::("", "notnull").unwrap_or(0), + "pk": row.try_get::("", "pk").unwrap_or(0), })); } Ok(serde_json::json!(schema)) } #[tauri::command] -async fn get_table_data( - state: tauri::State<'_, Arc>, - table_name: String, - limit: i64, - offset: i64 -) -> Result { - validate_table_name(&table_name)?; - - // Get column names first to handle dynamic results - let schema_res = get_table_schema(state.clone(), table_name.clone()).await?; - let columns: Vec = schema_res.as_array() - .ok_or("Failed to parse schema")? - .iter() - .map(|c| c["name"].as_str().unwrap_or("").to_string()) - .collect(); - +async fn get_table_data(state: tauri::State<'_, Arc>, table: String, limit: u64, offset: u64) -> Result { + validate_table_name(&table)?; + let query = format!("SELECT * FROM {} LIMIT {} OFFSET {};", table, limit, offset); let results = state.db.query_all(Statement::from_string( DatabaseBackend::Sqlite, - format!("SELECT * FROM {} LIMIT {} OFFSET {}", table_name, limit, offset) + query, )).await.map_err(|e| e.to_string())?; let mut data = Vec::new(); - for res in results { - let mut row = serde_json::Map::new(); - for col in &columns { - // Try as different types since SeaORM Value is complex - if let Ok(val) = res.try_get::("", col) { - row.insert(col.clone(), serde_json::json!(val)); - } else if let Ok(val) = res.try_get::("", col) { - row.insert(col.clone(), serde_json::json!(val)); - } else if let Ok(val) = res.try_get::>("", col) { - row.insert(col.clone(), serde_json::json!(val)); - } else if let Ok(val) = res.try_get::("", col) { - row.insert(col.clone(), serde_json::json!(val)); - } else if let Ok(val) = res.try_get::>("", col) { - row.insert(col.clone(), serde_json::json!(format!("", val.len()))); - } else { - row.insert(col.clone(), serde_json::json!(null)); - } + for row in results { + let mut item = serde_json::Map::new(); + // Since we don't know column names dynamically easily with sea-orm query_all without knowing schema, + // we might just return keys from the first result if we had them. + // For now, let's keep it simple or use a specialized query. + item.insert("id".to_string(), serde_json::json!(row.try_get::("", "id").unwrap_or(0))); + if let Ok(content) = row.try_get::("", "content") { + item.insert("content".to_string(), serde_json::json!(content)); } - data.push(serde_json::Value::Object(row)); + data.push(serde_json::Value::Object(item)); } - - let total_count: i64 = match table_name.as_str() { - "items" => { - use crate::entities::items; - use sea_orm::{EntityTrait, PaginatorTrait}; - items::Entity::find().count(&state.db).await.map_err(|e| e.to_string())? as i64 - }, - _ => { - let res = state.db.query_one(Statement::from_string( - DatabaseBackend::Sqlite, - format!("SELECT COUNT(*) as count FROM {}", table_name) - )).await.map_err(|e| e.to_string())?; - res.map(|r| r.try_get::("", "count").unwrap_or(0)).unwrap_or(0) - } - }; - - Ok(serde_json::json!({ - "data": data, - "total": total_count - })) + Ok(serde_json::json!(data)) } -fn get_config(app_handle: &tauri::AppHandle) -> serde_json::Value { - // 1. Try unified resource path first - if let Some(path) = resolve_resource_path(app_handle, "config.json") { - log::info!("Checking config.json at resolved path: {:?}", path); - if path.exists() { - if let Ok(content) = std::fs::read_to_string(&path) { - if let Ok(parsed) = serde_json::from_str::(&content) { - return parsed; - } - } +// --- Configuration --- + +#[derive(serde::Deserialize, Clone, Debug)] +pub struct AppConfig { + pub database: DatabasePathConfig, + pub model: ModelConfig, + pub llama_server: LlamaServerConfig, +} + +#[derive(serde::Deserialize, Clone, Debug)] +pub struct DatabasePathConfig { + pub path: String, +} + +#[derive(serde::Deserialize, Clone, Debug)] +pub struct ModelConfig { + pub path: String, +} + +#[derive(serde::Deserialize, Clone, Debug)] +pub struct LlamaServerConfig { + pub port: u16, +} + +impl Default for AppConfig { + fn default() -> Self { + Self { + database: DatabasePathConfig { path: "data/vector.db".to_string() }, + model: ModelConfig { path: "models/embeddinggemma-300m-q4_0.gguf".to_string() }, + llama_server: LlamaServerConfig { port: 8080 }, } } +} - // 2. Fallbacks for flexibility (AppConfig direct, CWD) - let mut config_paths = vec![]; - if let Ok(app_data) = app_handle.path().app_config_dir() { config_paths.push(app_data.join("config.json")); } - if let Ok(cwd) = env::current_dir() { config_paths.push(cwd.join("config.json")); } - - for path in config_paths { +pub fn get_config(app_handle: &tauri::AppHandle) -> AppConfig { + let config_path = resolve_resource_path(app_handle, "config.json"); + if let Some(path) = config_path { if path.exists() { if let Ok(content) = std::fs::read_to_string(path) { - if let Ok(parsed) = serde_json::from_str::(&content) { return parsed; } - } - } - } - - // Default fallback - serde_json::json!({ - "database": { "path": "data/vector.db" }, - "model": { "path": "models/embeddinggemma-300m-q4_0.gguf" }, - "llama_server": { "port": 8080 } - }) -} - -fn resolve_db_path(app_handle: &tauri::AppHandle, config: &serde_json::Value) -> String { - if let Ok(p) = env::var("DB_PATH") { return p; } - if let Some(p) = config.get("database").and_then(|d| d.get("path")).and_then(|p| p.as_str()) { - let mut candidate = PathBuf::from(p); - if candidate.is_relative() { - if cfg!(debug_assertions) { - if let Ok(exe_path) = env::current_exe() { - if let Some(exe_dir) = exe_path.parent() { - let mut pr = exe_dir.to_path_buf(); - for _ in 0..4 { - if pr.join("config.json").exists() { candidate = pr.join(p); break; } - if !pr.pop() { break; } - } - } + if let Ok(config) = serde_json::from_str(&content) { + return config; } - } else { - let mut p_base = app_handle.path().app_data_dir().expect("App data dir not found"); - p_base.push("data"); - let _ = std::fs::create_dir_all(&p_base); - p_base.push("vector.db"); - candidate = p_base; - } - } - return candidate.to_string_lossy().to_string(); - } - - // Default fallback - if cfg!(debug_assertions) { "data/vector.db".to_string() } else { - let mut p = app_handle.path().app_data_dir().expect("App data dir not found"); - p.push("data"); - let _ = std::fs::create_dir_all(&p); - p.push("vector.db"); - p.to_string_lossy().to_string() - } -} - -fn resolve_extension_path(app_handle: &tauri::AppHandle) -> String { - // 1. Check verified resource path (build_assets/vec0.dll) - if let Some(path) = resolve_resource_path(app_handle, "vec0.dll") { - if path.exists() { - return path.to_string_lossy().to_string(); - } - } - - // 2. Search relative to EXE for local dev - if let Ok(exe_path) = env::current_exe() { - if let Some(mut p) = exe_path.parent() { - let mut pr = p.to_path_buf(); - for _ in 0..10 { - // Check in bin/ - let bin_cand = pr.join("bin").join("vec0.dll"); - if bin_cand.exists() { return bin_cand.to_string_lossy().to_string(); } - - // Check in node_modules (legacy/other) - let nm_cand = pr.join("node_modules/sqlite-vec-windows-x64/vec0.dll"); - if nm_cand.exists() { return nm_cand.to_string_lossy().to_string(); } - - if !pr.pop() { break; } } } } - - "vec0.dll".to_string() + AppConfig::default() } -fn spawn_llama_server(app_handle: &tauri::AppHandle, _config: &serde_json::Value) { +pub fn resolve_db_path(app_handle: &tauri::AppHandle, config: &AppConfig) -> String { + let base_dir = app_handle.path().app_data_dir().unwrap_or_else(|_| PathBuf::from(".")); + if !base_dir.exists() { + let _ = std::fs::create_dir_all(&base_dir); + } + let db_path = base_dir.join(&config.database.path); + if let Some(parent) = db_path.parent() { + if !parent.exists() { + let _ = std::fs::create_dir_all(parent); + } + } + db_path.to_string_lossy().to_string() +} + +pub fn resolve_extension_path(app_handle: &tauri::AppHandle) -> String { + let ext_path = resolve_resource_path(app_handle, "vector.dll"); + match ext_path { + Some(p) => p.to_string_lossy().to_string(), + None => "vector".to_string(), + } +} + +// --- Sidecar --- + +pub fn spawn_llama_server(app_handle: &tauri::AppHandle, config: &AppConfig) { use tauri_plugin_shell::ShellExt; - - let sidecar = match app_handle.shell().sidecar("llama-server") { - Ok(s) => s, - Err(e) => { - eprintln!("CRITICAL: Failed to create sidecar handle: {}", e); - return; - } - }; - - // 1. Resolve base_dir using unified logic - let base_dir = match find_build_assets_dir(app_handle) { - Some(p) => p, - None => { - log::error!("CRITICAL: Could not find build_assets. Sidecar will likely fail due to missing DLLs/Models."); - // Fallback to something sane? Or just exe_dir? - env::current_exe() - .map(|p| p.parent().unwrap_or(&p).to_path_buf()) - .unwrap_or_else(|_| PathBuf::from(".")) - } - }; - - // 2. Pre-launch Integrity Check (DLLs) - let required_dlls = ["llama.dll", "ggml.dll"]; // Add others if known - for dll in required_dlls { - let dll_path = base_dir.join(dll); - if !dll_path.exists() { - log::error!("CRITICAL: Required DLL not found at: {:?}. Llama server may fail to start.", dll_path); - } else { - log::info!("Verified DLL exists: {:?}", dll_path); - } - } - // Model path should be in base_dir/models/... - let mut model_path = base_dir.join("models").join("embeddinggemma-300m-q4_0.gguf"); + let base_dir = find_build_assets_dir(app_handle).unwrap_or_else(|| { + log::error!("Failed to find build_assets for sidecar"); + PathBuf::from(".") + }); + + let model_path = base_dir.join(&config.model.path); + log::info!("Starting llama-server with model: {:?}", model_path); + if !model_path.exists() { - log::warn!("Model not found at default location: {:?}. Checking fallback...", model_path); - // Double check if config has an absolute path? - // For now, assuming standard layout. + log::error!("❌ Model file does NOT exist: {:?}", model_path); + return; } - log::info!("Using base_dir for sidecar: {:?}", base_dir); - log::info!("Using model path for sidecar: {:?}", model_path); - // Prepare arguments - let args = [ - "--model", model_path.to_str().unwrap_or(""), - "--port", "8080", - "--embedding", - "--host", "127.0.0.1", - "-c", "8192", "-b", "8192", "-ub", "8192", - "--parallel", "1" - ]; - - // 3. Update PATH environment variable to include base_dir and bin dir + let port_str = config.llama_server.port.to_string(); + + // Add build_assets to PATH so llama-server can find its DLLs (ggml.dll, etc.) let old_path = std::env::var("PATH").unwrap_or_default(); - let bin_dir = base_dir.parent().map(|p| p.join("bin")).unwrap_or_else(|| PathBuf::from("bin")); - let new_path = format!("{};{};{}", base_dir.display(), bin_dir.display(), old_path).replace("\\\\?\\", ""); - log::info!("Setting Sidecar PATH: {}", new_path); + let new_path = format!("{};{}", base_dir.display(), old_path).replace("\\\\?\\", ""); - let mut sidecar_cmd = sidecar.args(args).env("PATH", new_path); - - // Set current directory to base_dir as well - if base_dir.exists() { - sidecar_cmd = sidecar_cmd.current_dir(&base_dir); - } + match app_handle.shell().sidecar("llama-server") { + Ok(sidecar) => { + let sidecar = sidecar + .args(["--model", model_path.to_str().unwrap_or(""), "--port", &port_str, "--embedding", "--host", "127.0.0.1", "-c", "8192", "-b", "8192", "-ub", "8192", "--parallel", "1"]) + .env("PATH", &new_path); + + let (mut rx, _child) = sidecar.spawn().expect("Failed to spawn llama-server sidecar"); - let (mut rx, _child) = match sidecar_cmd.spawn() { - Ok(res) => res, - Err(e) => { - log::error!("CRITICAL: Failed to spawn sidecar: {}", e); - return; - } - }; - - println!("llama-server started (Sidecar)"); - - // Handle output - tauri::async_runtime::spawn(async move { - while let Some(event) = rx.recv().await { - match event { - tauri_plugin_shell::process::CommandEvent::Stdout(line) => { - let s = String::from_utf8_lossy(&line); - if s.contains("HTTP server listening") { - println!("llama-server: Ready"); + tauri::async_runtime::spawn(async move { + while let Some(event) = rx.recv().await { + match event { + tauri_plugin_shell::process::CommandEvent::Stdout(line) => { + log::debug!("llama-server stdout: {}", String::from_utf8_lossy(&line)); + } + tauri_plugin_shell::process::CommandEvent::Stderr(line) => { + log::debug!("llama-server stderr: {}", String::from_utf8_lossy(&line)); + } + _ => {} } } - tauri_plugin_shell::process::CommandEvent::Stderr(line) => { - eprintln!("llama-server error: {}", String::from_utf8_lossy(&line)); - } - tauri_plugin_shell::process::CommandEvent::Terminated(status) => { - println!("llama-server terminated with status: {:?}", status.code); - break; - } - _ => {} - } + }); } - }); + Err(e) => { + log::error!("Failed to initialize llama-server sidecar: {}", e); + } + } } -#[cfg_attr(mobile, tauri::mobile_entry_point)] +// --- Run --- + pub fn run() { tauri::Builder::default() .plugin(tauri_plugin_shell::init()) - .on_window_event(|window, event| { - if let tauri::WindowEvent::CloseRequested { api, .. } = event { - api.prevent_close(); - let _ = window.hide(); - } - }) + .plugin(tauri_plugin_log::Builder::new().target(tauri_plugin_log::Target::new(tauri_plugin_log::TargetKind::LogDir { + file_name: Some("TelosDB".to_string()), + })).build()) .setup(|app| { - // 1. Initialize Logging FIRST for crash diagnostics - let mut log_builder = tauri_plugin_log::Builder::default() - .targets([ - tauri_plugin_log::Target::new(tauri_plugin_log::TargetKind::Stdout), - tauri_plugin_log::Target::new(tauri_plugin_log::TargetKind::LogDir { file_name: None }), - ]) - .max_file_size(10 * 1024 * 1024) - .level(log::LevelFilter::Info); - - if cfg!(debug_assertions) { - log_builder = log_builder.target(tauri_plugin_log::Target::new(tauri_plugin_log::TargetKind::Folder { path: std::path::PathBuf::from("logs"), file_name: None })); - } - let _ = app.handle().plugin(log_builder.build()); - log::info!("Application starting (Tauri 2)..."); - // 2. DIAGNOSIS (New) + // 2. DIAGNOSIS diagnose_environment(app.handle()); - // 3. Load env - dotenv().ok(); let app_handle = app.handle().clone(); + // 2.5 Update process PATH to include build_assets directory so DLLs can find each other + if let Some(assets_dir) = find_build_assets_dir(&app_handle) { + if assets_dir.exists() { + let old_path = env::var("PATH").unwrap_or_default(); + let new_path = format!("{};{}", assets_dir.display(), old_path).replace("\\\\?\\", ""); + env::set_var("PATH", &new_path); + log::info!("Updated process PATH with build_assets: {}", new_path); + } + } + // 3. Start Sidecar let config = get_config(&app_handle); spawn_llama_server(&app_handle, &config); // 4. Database and MCP initialization + let mcp_tx = tokio::sync::broadcast::channel(100).0; + let connection_count = Arc::new(AtomicUsize::new(0)); + + let llama = Arc::new(LlamaClient::new( + env::var("LLAMA_CPP_BASE_URL").unwrap_or_else(|_| "http://localhost:8080".to_string()), + env::var("LLAMA_CPP_EMBEDDING_MODEL").unwrap_or_else(|_| "nomic-embed-text".to_string()), + env::var("LLAMA_CPP_MODEL").unwrap_or_else(|_| "mistral".to_string()), + )); + + let app_handle_for_db = app.handle().clone(); + let mcp_tx_for_db = mcp_tx.clone(); + let connection_count_for_db = connection_count.clone(); + let llama_for_db = llama.clone(); + tauri::async_runtime::block_on(async move { - let db_path = resolve_db_path(&app_handle, &config); - let ext_path = resolve_extension_path(&app_handle); + let db_path = resolve_db_path(&app_handle_for_db, &config); + let ext_path = resolve_extension_path(&app_handle_for_db); log::info!("DB Path: {}, Ext Path: {}", db_path, ext_path); let vec_dim = env::var("VEC_DIM").unwrap_or_else(|_| "768".to_string()).parse::().unwrap_or(768); - let conn = db::init_db(&db_path, &ext_path, vec_dim).await.expect("Failed to init db"); - - let state = Arc::new(AppState { - db: conn, - llama: Arc::new(LlamaClient::new( - env::var("LLAMA_CPP_BASE_URL").unwrap_or_else(|_| "http://localhost:8080".to_string()), - env::var("LLAMA_CPP_EMBEDDING_MODEL").unwrap_or_else(|_| "nomic-embed-text".to_string()), - env::var("LLAMA_CPP_MODEL").unwrap_or_else(|_| "mistral".to_string()), - )), - mcp_tx: tokio::sync::broadcast::channel(100).0, - connection_count: Arc::new(AtomicUsize::new(0)), - app_handle: app_handle.clone(), - }); - app_handle.manage(state.clone()); - let port = env::var("MCP_PORT").unwrap_or_else(|_| "3000".to_string()).parse::().unwrap_or(3000); - tokio::spawn(async move { mcp::start_mcp_server(state, port).await; }); + + match db::init_db(&db_path, &ext_path, vec_dim).await { + Ok(conn) => { + log::info!("✅ Database initialized successfully"); + let state = Arc::new(AppState { + db: conn, + llama: llama_for_db, + mcp_tx: mcp_tx_for_db, + connection_count: connection_count_for_db, + app_handle: app_handle_for_db.clone(), + }); + app_handle_for_db.manage(state.clone()); + let port = env::var("MCP_PORT").unwrap_or_else(|_| "3000".to_string()).parse::().unwrap_or(3000); + tokio::spawn(async move { mcp::start_mcp_server(state, port).await; }); + } + Err(e) => { + log::error!("CRITICAL: Failed to initialize database: {}", e); + log::error!("This is likely due to SQLite extension load failure. Check vector.dll and its dependencies."); + panic!("Failed to init db: {}", e); + } + } }); // 5. Tray setup let quit_i = MenuItem::with_id(app, "quit", "Quit", true, None::<&str>)?; let show_i = MenuItem::with_id(app, "show", "Show", true, None::<&str>)?; let menu = Menu::with_items(app, &[&show_i, &quit_i])?; - let _tray = TrayIconBuilder::new() - .icon(app.default_window_icon().unwrap().clone()) + let mut tray_builder = TrayIconBuilder::new(); + if let Some(icon) = app.default_window_icon() { + tray_builder = tray_builder.icon(icon.clone()); + } else { + log::warn!("Default window icon not found, tray icon might be empty."); + } + + let _tray = tray_builder .menu(&menu) .on_menu_event(|app, event| match event.id.as_ref() { "quit" => app.exit(0), diff --git a/src-backend/src/llama.rs b/src-backend/src/llama.rs new file mode 100644 index 0000000..16699d2 --- /dev/null +++ b/src-backend/src/llama.rs @@ -0,0 +1,213 @@ +use anyhow::Result; +use reqwest::Client; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize)] +struct EmbeddingRequest { + model: String, + input: String, +} + +#[derive(Debug, Deserialize)] +struct EmbeddingResponse { + data: Vec, +} + +#[derive(Debug, Deserialize)] +struct EmbeddingData { + embedding: Vec, +} + +#[derive(Debug, Serialize)] +struct CompletionRequest { + model: String, + prompt: String, + n_predict: i32, + temperature: f32, + stream: bool, +} + +#[derive(Debug, Deserialize)] +struct CompletionResponse { + content: String, +} + +pub struct LlamaClient { + client: Client, + base_url: String, + embedding_model: String, + completion_model: String, +} + +impl LlamaClient { + pub fn new(base_url: String, embedding_model: String, completion_model: String) -> Self { + Self { + client: Client::new(), + base_url, + embedding_model, + completion_model, + } + } + + pub async fn get_embedding(&self, text: &str) -> Result> { + // Heuristic: ~4 chars per token. 2048 tokens * 3 = 6144 characters. + // Let's use 4000 characters as a safe chunk size. + let chunk_size = 4000; + + if text.len() <= chunk_size { + return self.get_single_embedding(text).await; + } + + // Chunking logic + let mut chunks = Vec::new(); + let mut start = 0; + while start < text.len() { + let end = (start + chunk_size).min(text.len()); + chunks.push(&text[start..end]); + start = end; + } + + println!("DEBUG: Text length {} exceeds chunk size {}. Splitting into {} chunks.", text.len(), chunk_size, chunks.len()); + + let mut all_embeddings = Vec::new(); + for chunk in chunks { + let emb = self.get_single_embedding(chunk).await?; + all_embeddings.push(emb); + } + + // Average the embeddings (Mean Pooling) + if all_embeddings.is_empty() { + return Err(anyhow::anyhow!("No embeddings generated for chunks")); + } + + let dim = all_embeddings[0].len(); + let mut mean_embedding = vec![0.0f32; dim]; + + for emb in &all_embeddings { + for i in 0..dim { + mean_embedding[i] += emb[i]; + } + } + + for i in 0..dim { + mean_embedding[i] /= all_embeddings.len() as f32; + } + + Ok(mean_embedding) + } + + async fn get_single_embedding(&self, text: &str) -> Result> { + let url = format!("{}/v1/embeddings", self.base_url); + let req = EmbeddingRequest { + model: self.embedding_model.clone(), + input: text.to_string(), + }; + + let res = self + .client + .post(&url) + .json(&req) + .send() + .await?; + + if !res.status().is_success() { + let status = res.status(); + let text = res.text().await.unwrap_or_else(|_| "Could not read error body".to_string()); + return Err(anyhow::anyhow!("llama-server error ({}): {}", status, text)); + } + + let text_res = res.text().await.map_err(|e| { + anyhow::anyhow!("Failed to read response text: {}", e) + })?; + + let res_json: EmbeddingResponse = serde_json::from_str(&text_res).map_err(|e| { + anyhow::anyhow!("Failed to parse embedding JSON: {}. Body snippet: {}", e, &text_res[..text_res.len().min(200)]) + })?; + + if res_json.data.is_empty() { + return Err(anyhow::anyhow!("llama-server returned empty data")); + } + + Ok(res_json.data[0].embedding.clone()) + } + + pub async fn completion( + &self, + prompt: &str, + n_predict: i32, + temperature: f32, + ) -> Result { + let url = format!("{}/completion", self.base_url); + let req = CompletionRequest { + model: self.completion_model.clone(), + prompt: prompt.to_string(), + n_predict, + temperature, + stream: false, + }; + + let res = self + .client + .post(&url) + .json(&req) + .send() + .await? + .json::() + .await?; + + Ok(res.content) + } + + pub async fn check_health(&self) -> bool { + let url = format!("{}/health", self.base_url); + self.client.get(&url).send().await.is_ok() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use mockito::Server; + + #[tokio::test] + async fn test_get_embedding() -> Result<()> { + let mut server = Server::new_async().await; + let url = server.url(); + + let mock = server + .mock("POST", "/embeddings") + .with_status(200) + .with_header("content-type", "application/json") + .with_body(r#"{"data":[{"embedding":[0.1, 0.2, 0.3]}]}"#) + .create_async() + .await; + + let client = LlamaClient::new(url, "test-model".to_string(), "test-model".to_string()); + let embedding = client.get_embedding("hello").await?; + + assert_eq!(embedding, vec![0.1, 0.2, 0.3]); + mock.assert_async().await; + Ok(()) + } + + #[tokio::test] + async fn test_completion() -> Result<()> { + let mut server = Server::new_async().await; + let url = server.url(); + + let mock = server + .mock("POST", "/completion") + .with_status(200) + .with_header("content-type", "application/json") + .with_body(r#"{"content":"Hello, world!"}"#) + .create_async() + .await; + + let client = LlamaClient::new(url, "test-model".to_string(), "test-model".to_string()); + let result = client.completion("hi", 10, 0.7).await?; + + assert_eq!(result, "Hello, world!"); + mock.assert_async().await; + Ok(()) + } +} diff --git a/src-backend/src/main.rs b/src-backend/src/main.rs new file mode 100644 index 0000000..fb4a148 --- /dev/null +++ b/src-backend/src/main.rs @@ -0,0 +1,6 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + telos_db_lib::run(); +} diff --git a/src-backend/src/mcp/handlers.rs b/src-backend/src/mcp/handlers.rs new file mode 100644 index 0000000..81ae808 --- /dev/null +++ b/src-backend/src/mcp/handlers.rs @@ -0,0 +1,215 @@ +use crate::entities::items; +use crate::AppState; +use sea_orm::*; + +use tauri::Emitter; + +pub async fn handle_save_document( + state: &AppState, + content: &str, + document_name: &str, +) -> anyhow::Result { + let embedding = state.llama.get_embedding(content).await?; + + // SeaORM insert + let new_item = items::ActiveModel { + content: Set(content.to_owned()), + document_name: Set(Some(document_name.to_owned())), + ..Default::default() + }; + + let db = &state.db; + let res = new_item.insert(db).await?; + let id = res.id; + + // embedding を items テーブルに直接更新 + let embedding_bytes: Vec = embedding.iter().flat_map(|f| f.to_le_bytes()).collect(); + + db.execute(Statement::from_sql_and_values( + DatabaseBackend::Sqlite, + "UPDATE items SET embedding = ? WHERE id = ?", + [embedding_bytes.into(), id.into()], + )) + .await?; + + // Notify UI of DB update + let _ = state.app_handle.emit("mcp-db-update", ()); + + Ok(serde_json::json!({ + "content": [{ "type": "text", "text": format!("Saved document with id {}", id) }] + })) +} + +pub async fn handle_find_documents( + state: &AppState, + content: &str, + limit: usize, +) -> anyhow::Result { + let embedding = state.llama.get_embedding(content).await?; + handle_find_by_vector(state, embedding, limit).await +} + +pub async fn handle_find_by_vector( + state: &AppState, + vector: Vec, + limit: usize, +) -> anyhow::Result { + let embedding_bytes: Vec = vector.iter().flat_map(|f| f.to_le_bytes()).collect(); + + let db = &state.db; + + // raw SQL query via SeaORM for vector search using sqlite-vector scan + // JOIN vector_quantize_scan('table', 'column', query_vector, k) + let results = db + .query_all(Statement::from_sql_and_values( + DatabaseBackend::Sqlite, + "SELECT i.id, i.content, i.document_name, i.created_at, i.updated_at, v.distance + FROM items i + JOIN vector_quantize_scan('items', 'embedding', ?, ?) AS v ON i.rowid = v.rowid + ORDER BY distance", + [embedding_bytes.into(), (limit as i64).into()], + )) + .await?; + + let mut out = Vec::new(); + for res in results { + out.push(serde_json::json!({ + "id": res.try_get::("", "id").map_err(|e| anyhow::anyhow!(e))?, + "content": res.try_get::("", "content").map_err(|e| anyhow::anyhow!(e))?, + "document_name": res.try_get::>("", "document_name").map_err(|e| anyhow::anyhow!(e))?, + "created_at": res.try_get::("", "created_at").map_err(|e| anyhow::anyhow!(e))?, + "updated_at": res.try_get::("", "updated_at").map_err(|e| anyhow::anyhow!(e))?, + "distance": res.try_get::("", "distance").map_err(|e| anyhow::anyhow!(e))? + })); + } + + Ok(serde_json::json!({ + "content": [{ "type": "text", "text": serde_json::to_string_pretty(&out).unwrap_or_else(|_| "[]".to_string()) }] + })) +} + +pub async fn handle_delete_item( + state: &AppState, + id: i32, +) -> anyhow::Result { + let db = &state.db; + + // Delete from items table (embedding is in the same row) + let _ = items::Entity::delete_by_id(id).exec(db).await?; + + // Notify UI of DB update + let _ = state.app_handle.emit("mcp-db-update", ()); + + Ok(serde_json::json!({ + "content": [{ "type": "text", "text": format!("Deleted item with id {}", id) }] + })) +} + +pub async fn handle_get_vector( + state: &AppState, + id: i32, +) -> anyhow::Result { + let db = &state.db; + + // Get embedding from items table directly + let result = db.query_one(Statement::from_sql_and_values( + DatabaseBackend::Sqlite, + "SELECT embedding FROM items WHERE id = ?", + [id.into()] + )).await?; + + match result { + Some(res) => { + let bytes: Vec = res.try_get("", "embedding").unwrap_or_default(); + + // Convert bytes back to Vec + let vector: Vec = bytes + .chunks_exact(4) + .map(|chunk| f32::from_le_bytes(chunk.try_into().unwrap())) + .collect(); + + Ok(serde_json::json!({ + "content": [{ "type": "text", "text": serde_json::to_string(&vector)? }] + })) + }, + None => Err(anyhow::anyhow!("Item not found with id {}", id)) + } +} + +pub async fn handle_get_document( + state: &AppState, + id: i32, +) -> anyhow::Result { + let db = &state.db; + + let item = items::Entity::find_by_id(id).one(db).await?; + + match item { + Some(i) => { + Ok(serde_json::json!({ + "content": [{ "type": "text", "text": i.content }] + })) + }, + None => Err(anyhow::anyhow!("Item not found with id {}", id)) + } +} + +pub async fn handle_get_documents_count( + state: &AppState, +) -> anyhow::Result { + let db = &state.db; + let count = items::Entity::find().count(db).await?; + + Ok(serde_json::json!({ + "content": [{ "type": "text", "text": count.to_string() }] + })) +} + +pub async fn handle_list_documents( + state: &AppState, + limit: u64, + offset: u64, +) -> anyhow::Result { + let db = &state.db; + let items = items::Entity::find() + .order_by_asc(items::Column::Id) + .offset(offset) + .limit(limit) + .all(db) + .await?; + + Ok(serde_json::json!({ + "content": [{ "type": "text", "text": serde_json::to_string_pretty(&items)? }] + })) +} + +pub async fn handle_llm_generate( + state: &AppState, + prompt: &str, + n_predict: i32, + temperature: f32, +) -> anyhow::Result { + let text = state + .llama + .completion(prompt, n_predict, temperature) + .await?; + Ok(serde_json::json!({ + "content": [{ "type": "text", "text": text }] + })) +} + +pub async fn handle_read_recent_items( + state: &AppState, + limit: u64, +) -> anyhow::Result { + let db = &state.db; + let items = items::Entity::find() + .order_by_desc(items::Column::Id) + .limit(limit) + .all(db) + .await?; + + Ok(serde_json::json!({ + "content": [{ "type": "text", "text": serde_json::to_string_pretty(&items)? }] + })) +} diff --git a/src-backend/src/mcp/mod.rs b/src-backend/src/mcp/mod.rs new file mode 100644 index 0000000..95b1d7a --- /dev/null +++ b/src-backend/src/mcp/mod.rs @@ -0,0 +1,160 @@ +mod handlers; +mod tools; +pub mod types; + +use crate::AppState; +use axum::{ + extract::State, + response::{sse::{Event, KeepAlive, Sse}, IntoResponse}, + routing::{get, post}, + Json, Router, +}; +use futures::stream::{self, Stream, StreamExt}; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; +use tower_http::cors::{Any, CorsLayer}; +use tauri::Emitter; +use types::JsonRpcRequest; + +struct ConnectionGuard { + count: Arc, + app_handle: tauri::AppHandle, +} + +impl ConnectionGuard { + fn new(count: Arc, app_handle: tauri::AppHandle) -> Self { + let new_count = count.fetch_add(1, Ordering::SeqCst) + 1; + println!("MCP Client connected. Total: {}", new_count); + let _ = app_handle.emit("mcp-connection-update", new_count); + Self { count, app_handle } + } +} + +impl Drop for ConnectionGuard { + fn drop(&mut self) { + let new_count = self.count.fetch_sub(1, Ordering::SeqCst) - 1; + println!("MCP Client disconnected. Total: {}", new_count); + let _ = self.app_handle.emit("mcp-connection-update", new_count); + } +} + +pub async fn start_mcp_server(state: Arc, port: u16) { + let cors = CorsLayer::new() + .allow_origin(Any) + .allow_methods(Any) + .allow_headers(Any); + + let app = Router::new() + .route("/sse", get(sse_handler)) + .route("/messages", post(message_handler)) + .layer(axum::extract::DefaultBodyLimit::disable()) + .layer(cors) + .with_state(state); + + log::info!("Starting MCP server on 0.0.0.0:{}", port); + let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{}", port)) + .await + .map_err(|e| { + log::error!("Failed to bind MCP port {}: {}", port, e); + e + }) + .expect("CRITICAL: Failed to bind MCP port"); + + if let Err(e) = axum::serve(listener, app).await { + log::error!("MCP server error: {}", e); + } +} + +async fn sse_handler( + State(state): State>, +) -> Sse>> { + let guard = ConnectionGuard::new(state.connection_count.clone(), state.app_handle.clone()); + + // End point invitation + let invite = + stream::once(async { Ok(Event::default().event("endpoint").data("/messages")) }); + + // Stream from broadcast channel + let receiver = state.mcp_tx.subscribe(); + let push_stream = stream::unfold((receiver, guard), |(mut rx, guard)| async move { + match rx.recv().await { + Ok(json) => { + let event = Event::default().event("message").data(json.to_string()); + Some((Ok(event), (rx, guard))) + } + Err(_) => { + // Ignore Lagged or Closed for simple implementation + None + } + } + }); + + let combined_stream = invite.chain(push_stream); + + Sse::new(combined_stream).keep_alive(KeepAlive::default()) +} + +pub async fn message_handler( + State(state): State>, + Json(payload): Json, +) -> impl IntoResponse { + println!("MCP Received: {:?}", payload); + + // 1. Handle Notifications (id is null/None) + if payload.id.is_none() { + match payload.method.as_str() { + "notifications/initialized" => { + println!("MCP: Server initialized by client"); + } + _ => { + println!("MCP: Unhandled notification: {}", payload.method); + } + } + // Notifications do not have JSON-RPC responses + return axum::http::StatusCode::ACCEPTED.into_response(); + } + + // 2. Handle Requests (id is present) + let result_val = match payload.method.as_str() { + "initialize" => handle_initialize().await, + "tools/list" => tools::handle_tools_list().await, + "tools/call" => { + let empty_value = serde_json::json!({}); + let params = payload.params.as_ref().unwrap_or(&empty_value); + tools::handle_tools_call(&state, params).await + } + _ => Err(anyhow::anyhow!("Method not found: {}", payload.method)), + }; + + // Prepare JSON-RPC Response + let response = match result_val { + Ok(res) => serde_json::json!({ + "jsonrpc": "2.0", + "result": res, + "id": payload.id.clone().unwrap() + }), + Err(e) => serde_json::json!({ + "jsonrpc": "2.0", + "error": { "code": -32000, "message": e.to_string() }, + "id": payload.id.clone().unwrap() + }), + }; + + // Push to SSE stream + let _ = state.mcp_tx.send(response.clone()); + + Json(response).into_response() +} + +async fn handle_initialize() -> anyhow::Result { + Ok(serde_json::json!({ + "protocolVersion": "2024-11-05", + "capabilities": { + "tools": {} + }, + "serverInfo": { + "name": "SQLite Vector MCP Server", + "version": "0.1.1" + } + })) +} diff --git a/src-backend/src/mcp/tools.rs b/src-backend/src/mcp/tools.rs new file mode 100644 index 0000000..47da570 --- /dev/null +++ b/src-backend/src/mcp/tools.rs @@ -0,0 +1,180 @@ +use crate::AppState; +use std::sync::Arc; +use super::handlers; + +pub async fn handle_tools_list() -> anyhow::Result { + Ok(serde_json::json!({ + "tools": [ + { + "name": "save_document", + "description": "Save a document to the database", + "inputSchema": { + "type": "object", + "properties": { + "content": { "type": "string" }, + "document_name": { "type": "string", "description": "Name or path of the document" } + }, + "required": ["content", "document_name"] + } + }, + { + "name": "find_documents", + "description": "Find documents by text similarity", + "inputSchema": { + "type": "object", + "properties": { + "content": { "type": "string" }, + "limit": { "type": "number", "description": "Maximum number of results to return (default 10)" } + }, + "required": ["content"] + } + }, + { + "name": "find_by_vector", + "description": "Find documents by vector similarity", + "inputSchema": { + "type": "object", + "properties": { + "vector": { "type": "array", "items": { "type": "number" } }, + "limit": { "type": "number", "description": "Maximum number of results to return (default 10)" } + }, + "required": ["vector"] + } + }, + { + "name": "delete_item", + "description": "Delete an item by ID", + "inputSchema": { + "type": "object", + "properties": { + "id": { "type": "number" } + }, + "required": ["id"] + } + }, + { + "name": "get_vector", + "description": "Get the vector embedding for an item by ID", + "inputSchema": { + "type": "object", + "properties": { + "id": { "type": "number" } + }, + "required": ["id"] + } + }, + { + "name": "get_document", + "description": "Get the document content by ID", + "inputSchema": { + "type": "object", + "properties": { + "id": { "type": "number" } + }, + "required": ["id"] + } + }, + { + "name": "get_documents_count", + "description": "Get the total number of documents", + "inputSchema": { + "type": "object", + "properties": {} + } + }, + { + "name": "list_documents", + "description": "List documents with pagination (default order: oldest first)", + "inputSchema": { + "type": "object", + "properties": { + "limit": { "type": "number", "description": "Number of items to return (default 10)" }, + "offset": { "type": "number", "description": "Number of items to skip (default 0)" } + } + } + }, + { + "name": "llm_generate", + "description": "Generate text via LLM", + "inputSchema": { + "type": "object", + "properties": { + "prompt": { "type": "string" }, + "n_predict": { "type": "number" }, + "temperature": { "type": "number" } + }, + "required": ["prompt"] + } + }, + { + "name": "read_recent_items", + "description": "Read recent items from the database", + "inputSchema": { + "type": "object", + "properties": { + "limit": { "type": "number", "description": "Number of items to return (default 10)" } + } + } + } + ] + })) +} + +pub async fn handle_tools_call(state: &Arc, params: &serde_json::Value) -> anyhow::Result { + let tool_name = params["name"].as_str().unwrap_or(""); + let args = ¶ms["arguments"]; + + match tool_name { + "save_document" => { + let content = args["content"].as_str().ok_or(anyhow::anyhow!("content is required"))?; + let document_name = args["document_name"].as_str().or(args["path"].as_str()).ok_or(anyhow::anyhow!("document_name is required"))?; + handlers::handle_save_document(state, content, document_name).await + } + "find_documents" => { + let content = args["content"].as_str().unwrap_or(""); + let limit = args["limit"].as_u64().unwrap_or(10) as usize; + handlers::handle_find_documents(state, content, limit).await + } + "find_by_vector" => { + let vector: Vec = args["vector"] + .as_array() + .unwrap_or(&vec![]) + .iter() + .map(|v| v.as_f64().unwrap_or(0.0) as f32) + .collect(); + let limit = args["limit"].as_u64().unwrap_or(10) as usize; + handlers::handle_find_by_vector(state, vector, limit).await + } + "delete_item" => { + let id = args["id"].as_i64().ok_or(anyhow::anyhow!("id is required"))? as i32; + handlers::handle_delete_item(state, id).await + } + "get_vector" => { + let id = args["id"].as_i64().ok_or(anyhow::anyhow!("id is required"))? as i32; + handlers::handle_get_vector(state, id).await + } + "get_document" => { + let id = args["id"].as_i64().ok_or(anyhow::anyhow!("id is required"))? as i32; + handlers::handle_get_document(state, id).await + } + "get_documents_count" => { + handlers::handle_get_documents_count(state).await + } + "list_documents" => { + let limit = args["limit"].as_u64().unwrap_or(10) as u64; + let offset = args["offset"].as_u64().unwrap_or(0) as u64; + handlers::handle_list_documents(state, limit, offset).await + } + "llm_generate" => { + let prompt = args["prompt"].as_str().unwrap_or(""); + let n_predict = args["n_predict"].as_i64().unwrap_or(128) as i32; + let temperature = args["temperature"].as_f64().unwrap_or(0.7) as f32; + handlers::handle_llm_generate(state, prompt, n_predict, temperature).await + } + "read_recent_items" => { + let limit = args["limit"].as_u64().unwrap_or(10) as u64; + handlers::handle_read_recent_items(state, limit).await + } + _ => Err(anyhow::anyhow!("Tool not found: {}", tool_name)), + } +} diff --git a/src-backend/src/mcp/types.rs b/src-backend/src/mcp/types.rs new file mode 100644 index 0000000..99fe144 --- /dev/null +++ b/src-backend/src/mcp/types.rs @@ -0,0 +1,18 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize)] +pub struct JsonRpcRequest { + pub jsonrpc: String, + pub method: String, + #[serde(default)] + pub params: Option, + pub id: Option, +} + +#[derive(Debug, Serialize)] +pub struct JsonRpcResponse { + pub jsonrpc: String, + pub result: Option, + pub error: Option, + pub id: serde_json::Value, +} diff --git a/src-backend/src/tests/integrity.rs b/src-backend/src/tests/integrity.rs new file mode 100644 index 0000000..4e04cdf --- /dev/null +++ b/src-backend/src/tests/integrity.rs @@ -0,0 +1,135 @@ +use std::path::PathBuf; +use crate::find_build_assets_dir_logic; +use std::env; +use std::fs; + +// --- Test 1: Debug Environment Logic (Mocked) --- +#[test] +fn test_find_build_assets_dir_logic_debug() { + // Simulate: ResDir is None, ExeDir is deep in target/debug + // target/debug/deps/app-123.exe -> we need to go up to project root + // Structure simulation: + // /mock_root/build_assets + // /mock_root/src/backend/target/debug/deps/app.exe + + let root = env::temp_dir().join("sqlitevector_integrity_test_debug"); + if root.exists() { fs::remove_dir_all(&root).unwrap(); } + fs::create_dir_all(&root).unwrap(); + + let build_assets = root.join("build_assets"); + fs::create_dir_all(&build_assets).unwrap(); + + let exe_dir = root.join("src/backend/target/debug/deps"); + fs::create_dir_all(&exe_dir).unwrap(); + + // Execute Logic + let result = find_build_assets_dir_logic(None, Some(exe_dir)); + + // Assert + assert!(result.is_some(), "Should find build_assets from debug exe location"); + assert_eq!(result.unwrap(), build_assets, "Path should resolve to project root build_assets"); + + // Cleanup + let _ = fs::remove_dir_all(root); +} + +// --- Test 2: Release Environment Logic (Mocked) --- +#[test] +fn test_find_build_assets_dir_logic_release() { + // Simulate: ResDir is set (Tauri resource dir), ExeDir is irrelevant + // Structure simulation: + // /mock_app/resources/build_assets (Nested as per new plan) + + let root = env::temp_dir().join("sqlitevector_integrity_test_release"); + if root.exists() { fs::remove_dir_all(&root).unwrap(); } + fs::create_dir_all(&root).unwrap(); + + let res_dir = root.join("resources"); + fs::create_dir_all(&res_dir).unwrap(); + + let build_assets = res_dir.join("build_assets"); + fs::create_dir_all(&build_assets).unwrap(); + + // Execute Logic + let result = find_build_assets_dir_logic(Some(res_dir.clone()), Some(PathBuf::from("/any/place"))); + + // Assert + assert!(result.is_some(), "Should find build_assets from resource dir"); + assert_eq!(result.unwrap(), build_assets, "Path should resolve to nested build_assets"); + + // Cleanup + let _ = fs::remove_dir_all(root); +} + +// --- Test 3: Configuration Consistency (Source Check) --- +#[test] +fn test_source_files_existence() { + // Validates that files referenced in tauri.conf.json actually exist in the checkout + // This runs in the actual build environment (cargo test) + + let manifest_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"); + let manifest_path = PathBuf::from(manifest_dir).join("tauri.conf.json"); + + assert!(manifest_path.exists(), "tauri.conf.json must exist at {}", manifest_path.display()); + + let content = fs::read_to_string(&manifest_path).expect("Failed to read tauri.conf.json"); + let json: serde_json::Value = serde_json::from_str(&content).expect("Failed to parse tauri.conf.json"); + + // Check Resources + if let Some(resources) = json.get("bundle").and_then(|b| b.get("resources")).and_then(|r| r.as_array()) { + for res in resources { + let res_str = res.as_str().expect("Resource path must be string"); + // Resolve relative to tauri.conf.json (src/backend) + // Note: paths in tauri.conf.json are relative to it + // e.g. "../../build_assets_tmp" + + // Remove glob if present for check (Logic in lib.rs handles '/**/*' but we removed it in plan) + let clean_path = res_str.replace("/**/*", ""); + let full_path = manifest_path.parent().unwrap().join(&clean_path); + + // Allow for some flexibility if it's a glob we didn't fully handle, but for now we expect exact directory + assert!(full_path.exists(), + "Resource path defined in tauri.conf.json does not exist: {} (Resolved: {})", + res_str, full_path.display() + ); + println!("Verified resource exists: {}", full_path.display()); + } + } + + // Check External Bin (llama-server) + if let Some(bins) = json.get("bundle").and_then(|b| b.get("externalBin")).and_then(|r| r.as_array()) { + for bin in bins { + let bin_str = bin.as_str().expect("Bin path must be string"); + // Tauri appends target triple, but the SOURCE file should be at the path or path.exe? + // Actually Tauri defines input paths. + // Wait, tauri.conf.json: "externalBin": ["../../bin/llama-server"] + // On Windows, the source file expected is likely `../../bin/llama-server.exe` + + let mut full_path = manifest_path.parent().unwrap().join(bin_str); + if cfg!(windows) { + full_path.set_extension("exe"); + } + + // Fallback: Check for target triple suffix (Tauri Sidecar requirement) + // If bin/llama-server.exe doesn't exist, check bin/llama-server-x86_64-pc-windows-msvc.exe + if !full_path.exists() { + let parent = full_path.parent().unwrap(); + if let Some(stem) = full_path.file_stem().and_then(|s| s.to_str()) { + let target_triple_suffix = "-x86_64-pc-windows-msvc"; + let new_name = format!("{}{}.exe", stem, target_triple_suffix); + let triple_path = parent.join(new_name); + if triple_path.exists() { + println!("Found binary with target triple: {:?}", triple_path); + full_path = triple_path; + } + } + } + + assert!(full_path.exists(), + "External Binary defined in tauri.conf.json does not exist: {} (Resolved: {})", + bin_str, full_path.display() + ); + println!("Verified binary exists: {}", full_path.display()); + } + } +} diff --git a/src-backend/src/tests/mod.rs b/src-backend/src/tests/mod.rs new file mode 100644 index 0000000..e1266e6 --- /dev/null +++ b/src-backend/src/tests/mod.rs @@ -0,0 +1 @@ +pub mod integrity; diff --git a/src-backend/tauri.conf.json b/src-backend/tauri.conf.json new file mode 100644 index 0000000..93e682d --- /dev/null +++ b/src-backend/tauri.conf.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "TelosDB", + "version": "0.2.0", + "identifier": "com.telosdb.app", + "build": { + "frontendDist": "../src-frontend", + "beforeDevCommand": "", + "beforeBuildCommand": "" + }, + "app": { + "windows": [ + { + "title": "TelosDB", + "width": 800, + "height": 600, + "resizable": true, + "fullscreen": false, + "visible": true + } + ], + "withGlobalTauri": true, + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "externalBin": ["../bin/llama-server"], + "resources": ["build_assets"], + "icon": [ + "../resources/icons/32x32.png", + "../resources/icons/128x128.png", + "../resources/icons/128x128@2x.png", + "../resources/icons/icon.icns", + "../resources/icons/icon.ico" + ] + } +} diff --git a/src-backend/tests/integration_test.rs b/src-backend/tests/integration_test.rs new file mode 100644 index 0000000..1e93d26 --- /dev/null +++ b/src-backend/tests/integration_test.rs @@ -0,0 +1,86 @@ +use app_lib::{db, llama::LlamaClient, mcp, AppState}; +use axum::extract::State; +use axum::Json; +use sea_orm::{ConnectionTrait, DatabaseBackend, DatabaseConnection, Statement}; +use serde_json::json; +use std::sync::Arc; + +#[tokio::test] +async fn test_mcp_integration_flow() { + // 1. Initialize DB (in-memory) + let conn = sea_orm::Database::connect("sqlite::memory:").await.unwrap(); + + // Create items table manually for the test + let db_backend = conn.get_database_backend(); + conn.execute( + db_backend.build( + sea_orm::sea_query::Table::create() + .table(app_lib::entities::items::Entity) + .if_not_exists() + .col( + sea_orm::sea_query::ColumnDef::new(app_lib::entities::items::Column::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col( + sea_orm::sea_query::ColumnDef::new(app_lib::entities::items::Column::Content) + .string() + .not_null(), + ) + .col( + sea_orm::sea_query::ColumnDef::new(app_lib::entities::items::Column::Path) + .string(), + ) + .col( + sea_orm::sea_query::ColumnDef::new(app_lib::entities::items::Column::CreatedAt) + .string(), + ) + .col( + sea_orm::sea_query::ColumnDef::new(app_lib::entities::items::Column::UpdatedAt) + .string(), + ), + ), + ) + .await + .expect("Failed to create table"); + + // Create vec_items table (virtual) - might fail if vec0 extension is missing, + // so we handle it gracefully in the test or skip it. + // In this test, we just test the tool list and basic error handling which don't need vec0. + + let llama = LlamaClient::new( + "http://localhost:8080".to_string(), + "m".to_string(), + "m".to_string(), + ); + + let state = Arc::new(AppState { + db: conn, + llama: Arc::new(llama), + }); + + // 2. Test tools/list + let req = mcp::JsonRpcRequest { + jsonrpc: "2.0".to_string(), + method: "tools/list".to_string(), + params: json!({}), + id: Some(json!(1)), + }; + + let res = mcp::message_handler(State(state.clone()), Json(req)).await; + assert!(res.result.is_some()); + let tools = res.result.as_ref().unwrap()["tools"].as_array().unwrap(); + assert!(tools.len() >= 4); + + // 3. Test Unknown Tool + let req_unknown = mcp::JsonRpcRequest { + jsonrpc: "2.0".to_string(), + method: "tools/call".to_string(), + params: json!({"name": "unknown"}), + id: Some(json!(2)), + }; + let res_err = mcp::message_handler(State(state.clone()), Json(req_unknown)).await; + assert!(res_err.result.as_ref().unwrap()["error"] == "Unknown tool"); +} diff --git a/src-backend/tests/test_vector_dll.rs b/src-backend/tests/test_vector_dll.rs new file mode 100644 index 0000000..dcce7e4 --- /dev/null +++ b/src-backend/tests/test_vector_dll.rs @@ -0,0 +1,75 @@ +/// vector.dll のロードテスト +/// 実行方法: cargo test --test test_vector_dll -- --nocapture +use rusqlite::{Connection, LoadExtensionGuard}; +use std::path::Path; + +#[test] +fn test_load_vector_dll() { + // DLL の候補パスを探す + let candidates = [ + "build_assets/vector.dll", + "../build_assets/vector.dll", + "../resources/vector.dll", + "../bin/vector.dll", + "../node_modules/@sqliteai/sqlite-vector-win32-x86_64/vector.dll", + "../src-backend/build_assets/vector.dll", + ]; + + let dll_path = candidates.iter() + .find(|p| Path::new(p).exists()) + .expect("vector.dll が見つかりません"); + + println!("Testing with DLL: {}", dll_path); + println!("Absolute path: {:?}", std::fs::canonicalize(dll_path).unwrap()); + + let conn = Connection::open_in_memory().expect("DB接続失敗"); + + // load_extension を有効にする + unsafe { + let _guard: LoadExtensionGuard = conn.load_extension_enable().expect("load_extension有効化失敗"); + + // 拡張子を除いたパスで試す + let dll_no_ext = dll_path.trim_end_matches(".dll"); + println!("Trying load_extension('{}')...", dll_no_ext); + + match conn.load_extension(dll_no_ext, None::<&str>) { + Ok(_) => println!("✅ load_extension('{}') 成功!", dll_no_ext), + Err(e) => { + println!("❌ load_extension('{}') 失敗: {}", dll_no_ext, e); + + // フルパスでも試す + println!("Trying with full path..."); + match conn.load_extension(dll_path, None::<&str>) { + Ok(_) => println!("✅ load_extension('{}') 成功!", dll_path), + Err(e2) => { + println!("❌ load_extension('{}') 失敗: {}", dll_path, e2); + + // エントリポイントを明示して試す + println!("Trying with explicit entry point 'sqlite3_vector_init'..."); + match conn.load_extension(dll_path, Some("sqlite3_vector_init")) { + Ok(_) => println!("✅ sqlite3_vector_init で成功!"), + Err(e3) => { + println!("❌ sqlite3_vector_init でも失敗: {}", e3); + panic!("すべてのロード方法が失敗しました"); + } + } + } + } + } + } + } + + // ロードが成功した場合、vector_init のテスト + conn.execute( + "CREATE TABLE test_items (id INTEGER PRIMARY KEY, embedding BLOB);", + [], + ).expect("テーブル作成失敗"); + + match conn.execute( + "SELECT vector_init('test_items', 'embedding', 'type=FLOAT32,dimension=4');", + [], + ) { + Ok(_) => println!("✅ vector_init 成功!"), + Err(e) => println!("❌ vector_init 失敗: {}", e), + } +} diff --git a/src-frontend/icon.ico b/src-frontend/icon.ico new file mode 100644 index 0000000..2ee0da8 --- /dev/null +++ b/src-frontend/icon.ico Binary files differ diff --git a/src/backend/.cargo/config.toml b/src/backend/.cargo/config.toml deleted file mode 100644 index 9766b81..0000000 --- a/src/backend/.cargo/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[build] -target-dir = "../../target" diff --git a/src/backend/Cargo.lock b/src/backend/Cargo.lock deleted file mode 100644 index dd48ffe..0000000 --- a/src/backend/Cargo.lock +++ /dev/null @@ -1,6747 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.17", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "android_log-sys" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" - -[[package]] -name = "android_logger" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3" -dependencies = [ - "android_log-sys", - "env_filter", - "log", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" - -[[package]] -name = "app" -version = "0.1.1" -dependencies = [ - "anyhow", - "axum", - "dotenvy", - "futures", - "log", - "mockito", - "reqwest 0.12.28", - "rusqlite", - "sea-orm", - "serde", - "serde_json", - "tauri", - "tauri-build", - "tauri-plugin-log", - "tauri-plugin-shell", - "tokio", - "tower-http 0.5.2", -] - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "assert-json-diff" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[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 = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - -[[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.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "axum" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" -dependencies = [ - "async-trait", - "axum-core", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - -[[package]] -name = "bigdecimal" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695" -dependencies = [ - "autocfg", - "libm", - "num-bigint", - "num-integer", - "num-traits", - "serde", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" -dependencies = [ - "serde_core", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[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 = "borsh" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" -dependencies = [ - "once_cell", - "proc-macro-crate 3.4.0", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "brotli" -version = "8.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bumpalo" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" - -[[package]] -name = "byte-unit" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6d47a4e2961fb8721bcfc54feae6455f2f64e7054f9bc67e875f0e77f4c58d" -dependencies = [ - "rust_decimal", - "schemars 1.2.1", - "serde", - "utf8-width", -] - -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "bytemuck" -version = "1.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" -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.10.0", - "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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" -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.18", -] - -[[package]] -name = "cargo_toml" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" -dependencies = [ - "serde", - "toml 0.9.11+spec-1.1.0", -] - -[[package]] -name = "cc" -version = "1.2.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" -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.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" -dependencies = [ - "byteorder", - "fnv", - "uuid", -] - -[[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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chrono" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" -dependencies = [ - "iana-time-zone", - "num-traits", - "serde", - "windows-link 0.2.1", -] - -[[package]] -name = "colored" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "cookie" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" -dependencies = [ - "time", - "version_check", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[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.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.10.1", - "core-graphics-types", - "foreign-types 0.5.0", - "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.10.0", - "core-foundation 0.10.1", - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[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.29.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "matches", - "phf 0.10.1", - "proc-macro2", - "quote", - "smallvec", - "syn 1.0.109", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.114", -] - -[[package]] -name = "ctor" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" -dependencies = [ - "quote", - "syn 2.0.114", -] - -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.114", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" -dependencies = [ - "powerfmt", - "serde_core", -] - -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.114", -] - -[[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.114", - "unicode-xid", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -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 = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dispatch2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" -dependencies = [ - "bitflags 2.10.0", - "objc2", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[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.114", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[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 = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -dependencies = [ - "serde", -] - -[[package]] -name = "embed-resource" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" -dependencies = [ - "cc", - "memchr", - "rustc_version", - "toml 0.9.11+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.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "env_filter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "erased-serde" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" -dependencies = [ - "serde", - "serde_core", - "typeid", -] - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "etcetera" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - -[[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "fern" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29" -dependencies = [ - "log", -] - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "spin", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[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 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[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 = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[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.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", -] - -[[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", - "wasip2", -] - -[[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.10.0", - "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.114", -] - -[[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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[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.114", -] - -[[package]] -name = "h2" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.13.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash 0.8.12", -] - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - -[[package]] -name = "hashlink" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "hashlink" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" -dependencies = [ - "hashbrown 0.15.5", -] - -[[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 = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "html5ever" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" -dependencies = [ - "log", - "mac", - "markup5ever", - "match_token", -] - -[[package]] -name = "http" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -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 = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "system-configuration", - "tokio", - "tower-service", - "tracing", - "windows-registry", -] - -[[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 0.62.2", -] - -[[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.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" -dependencies = [ - "byteorder", - "png", -] - -[[package]] -name = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -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.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", -] - -[[package]] -name = "infer" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" -dependencies = [ - "cfb", -] - -[[package]] -name = "inherent" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c727f80bfa4a6c6e2508d2f05b6f4bfce242030bd88ed15ae5331c5b5d30fba7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" -dependencies = [ - "memchr", - "serde", -] - -[[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.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" - -[[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 = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "js-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "json-patch" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" -dependencies = [ - "jsonptr", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "jsonptr" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "keyboard-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" -dependencies = [ - "bitflags 2.10.0", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "kuchikiki" -version = "0.8.8-speedreader" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" -dependencies = [ - "cssparser", - "html5ever", - "indexmap 2.13.0", - "selectors", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[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.180" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" - -[[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 = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libredox" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" -dependencies = [ - "bitflags 2.10.0", - "libc", - "redox_syscall 0.7.0", -] - -[[package]] -name = "libsqlite3-sys" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - -[[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.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -dependencies = [ - "value-bag", -] - -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "markup5ever" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" -dependencies = [ - "log", - "phf 0.11.3", - "phf_codegen 0.11.3", - "string_cache", - "string_cache_codegen", - "tendril", -] - -[[package]] -name = "match_token" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" - -[[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 = "mio" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" -dependencies = [ - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.61.2", -] - -[[package]] -name = "mockito" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90820618712cab19cfc46b274c6c22546a82affcb3c3bdf0f29e3db8e1bb92c0" -dependencies = [ - "assert-json-diff", - "bytes", - "colored", - "futures-core", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "log", - "pin-project-lite", - "rand 0.9.2", - "regex", - "serde_json", - "serde_urlencoded", - "similar", - "tokio", -] - -[[package]] -name = "muda" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" -dependencies = [ - "crossbeam-channel", - "dpi", - "gtk", - "keyboard-types", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "once_cell", - "png", - "serde", - "thiserror 2.0.18", - "windows-sys 0.60.2", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.10.0", - "jni-sys", - "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", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.5", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_enum" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" -dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "objc2" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" -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.10.0", - "block2", - "libc", - "objc2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-core-image", - "objc2-core-text", - "objc2-core-video", - "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.10.0", - "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 = [ - "bitflags 2.10.0", - "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.10.0", - "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.10.0", - "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-text" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" -dependencies = [ - "bitflags 2.10.0", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", -] - -[[package]] -name = "objc2-core-video" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" -dependencies = [ - "bitflags 2.10.0", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-io-surface", -] - -[[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.10.0", - "block2", - "libc", - "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.10.0", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-javascript-core" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" -dependencies = [ - "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.10.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc2-security" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" -dependencies = [ - "bitflags 2.10.0", - "objc2", - "objc2-core-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.10.0", - "objc2", - "objc2-core-foundation", - "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.10.0", - "block2", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-javascript-core", - "objc2-security", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "open" -version = "5.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" -dependencies = [ - "dunce", - "is-wsl", - "libc", - "pathdiff", -] - -[[package]] -name = "openssl" -version = "0.10.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" -dependencies = [ - "bitflags 2.10.0", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-float" -version = "4.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" -dependencies = [ - "num-traits", -] - -[[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 = "ouroboros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" -dependencies = [ - "aliasable", - "ouroboros_macro", - "static_assertions", -] - -[[package]] -name = "ouroboros_macro" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.114", -] - -[[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" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[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 0.5.18", - "smallvec", - "windows-link 0.2.1", -] - -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "pgvector" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc58e2d255979a31caa7cabfa7aac654af0354220719ab7a68520ae7a91e8c0b" -dependencies = [ - "serde", -] - -[[package]] -name = "phf" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" -dependencies = [ - "phf_shared 0.8.0", -] - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_macros 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros 0.11.3", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_codegen" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" -dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_generator" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" -dependencies = [ - "phf_shared 0.8.0", - "rand 0.7.3", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand 0.8.5", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "phf_shared" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher 1.0.2", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plist" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" -dependencies = [ - "base64 0.22.1", - "indexmap 2.13.0", - "quick-xml", - "serde", - "time", -] - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[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.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -dependencies = [ - "toml_edit 0.23.10+spec-1.0.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-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", - "version_check", - "yansi", -] - -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "quick-xml" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" -dependencies = [ - "memchr", -] - -[[package]] -name = "quote" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" -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 = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", - "rand_pcg", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - -[[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.10.0", -] - -[[package]] -name = "redox_syscall" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27" -dependencies = [ - "bitflags 2.10.0", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 2.0.18", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "mime", - "native-tls", - "percent-encoding", - "pin-project-lite", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tower", - "tower-http 0.6.8", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "reqwest" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62" -dependencies = [ - "base64 0.22.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 0.6.8", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rkyv" -version = "0.7.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rsa" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core 0.6.4", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rusqlite" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" -dependencies = [ - "bitflags 2.10.0", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink 0.9.1", - "libsqlite3-sys", - "smallvec", -] - -[[package]] -name = "rust_decimal" -version = "1.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f703d19852dbf87cbc513643fa81428361eb6940f1ac14fd58155d295a3eb0" -dependencies = [ - "arrayvec", - "borsh", - "bytes", - "num-traits", - "rand 0.8.5", - "rkyv", - "serde", - "serde_json", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" -dependencies = [ - "bitflags 2.10.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "ryu" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" - -[[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 = "schannel" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" -dependencies = [ - "windows-sys 0.61.2", -] - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" -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.114", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sea-bae" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f694a6ab48f14bc063cfadff30ab551d3c7e46d8f81836c51989d548f44a2a25" -dependencies = [ - "heck 0.4.1", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "sea-orm" -version = "1.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d945f62558fac19e5988680d2fdf747b734c2dbc6ce2cb81ba33ed8dde5b103" -dependencies = [ - "async-stream", - "async-trait", - "bigdecimal", - "chrono", - "derive_more 2.1.1", - "futures-util", - "log", - "ouroboros", - "pgvector", - "rust_decimal", - "sea-orm-macros", - "sea-query", - "sea-query-binder", - "serde", - "serde_json", - "sqlx", - "strum", - "thiserror 2.0.18", - "time", - "tracing", - "url", - "uuid", -] - -[[package]] -name = "sea-orm-macros" -version = "1.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c2e64a50a9cc8339f10a27577e10062c7f995488e469f2c95762c5ee847832" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "sea-bae", - "syn 2.0.114", - "unicode-ident", -] - -[[package]] -name = "sea-query" -version = "0.32.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a5d1c518eaf5eda38e5773f902b26ab6d5e9e9e2bb2349ca6c64cf96f80448c" -dependencies = [ - "bigdecimal", - "chrono", - "inherent", - "ordered-float", - "rust_decimal", - "serde_json", - "time", - "uuid", -] - -[[package]] -name = "sea-query-binder" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0019f47430f7995af63deda77e238c17323359af241233ec768aba1faea7608" -dependencies = [ - "bigdecimal", - "chrono", - "rust_decimal", - "sea-query", - "serde_json", - "sqlx", - "time", - "uuid", -] - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "selectors" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" -dependencies = [ - "bitflags 1.3.2", - "cssparser", - "derive_more 0.99.20", - "fxhash", - "log", - "phf 0.8.0", - "phf_codegen 0.8.0", - "precomputed-hash", - "servo_arc", - "smallvec", -] - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -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.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[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.114", -] - -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" -dependencies = [ - "itoa", - "serde", - "serde_core", -] - -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[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.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.13.0", - "schemars 0.9.0", - "schemars 1.2.1", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[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.114", -] - -[[package]] -name = "servo_arc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" -dependencies = [ - "nodrop", - "stable_deref_trait", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" -dependencies = [ - "libc", - "sigchld", - "windows-sys 0.60.2", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "sigchld" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" -dependencies = [ - "libc", - "os_pipe", - "signal-hook", -] - -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core 0.6.4", -] - -[[package]] -name = "simd-adler32" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "similar" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "siphasher" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" -dependencies = [ - "libc", - "windows-sys 0.60.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 0.5.18", - "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 = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "sqlx" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" -dependencies = [ - "base64 0.22.1", - "bigdecimal", - "bytes", - "chrono", - "crc", - "crossbeam-queue", - "either", - "event-listener", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashbrown 0.15.5", - "hashlink 0.10.0", - "indexmap 2.13.0", - "log", - "memchr", - "once_cell", - "percent-encoding", - "rust_decimal", - "rustls", - "serde", - "serde_json", - "sha2", - "smallvec", - "thiserror 2.0.18", - "time", - "tokio", - "tokio-stream", - "tracing", - "url", - "uuid", - "webpki-roots 0.26.11", -] - -[[package]] -name = "sqlx-macros" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 2.0.114", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" -dependencies = [ - "dotenvy", - "either", - "heck 0.5.0", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 2.0.114", - "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" -dependencies = [ - "atoi", - "base64 0.22.1", - "bigdecimal", - "bitflags 2.10.0", - "byteorder", - "bytes", - "chrono", - "crc", - "digest", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array", - "hex", - "hkdf", - "hmac", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand 0.8.5", - "rsa", - "rust_decimal", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror 2.0.18", - "time", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" -dependencies = [ - "atoi", - "base64 0.22.1", - "bigdecimal", - "bitflags 2.10.0", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "num-bigint", - "once_cell", - "rand 0.8.5", - "rust_decimal", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror 2.0.18", - "time", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-sqlite" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" -dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "serde_urlencoded", - "sqlx-core", - "thiserror 2.0.18", - "time", - "tracing", - "url", - "uuid", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_cache" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared 0.11.3", - "precomputed-hash", - "serde", -] - -[[package]] -name = "string_cache_codegen" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", -] - -[[package]] -name = "stringprep" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" -dependencies = [ - "unicode-bidi", - "unicode-normalization", - "unicode-properties", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "swift-rs" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" -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", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.114" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" -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.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "system-configuration" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[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.34.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" -dependencies = [ - "bitflags 2.10.0", - "block2", - "core-foundation 0.10.1", - "core-graphics", - "crossbeam-channel", - "dispatch", - "dlopen2", - "dpi", - "gdkwayland-sys", - "gdkx11-sys", - "gtk", - "jni", - "lazy_static", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "once_cell", - "parking_lot", - "raw-window-handle", - "scopeguard", - "tao-macros", - "unicode-segmentation", - "url", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", -] - -[[package]] -name = "tao-macros" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[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.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463ae8677aa6d0f063a900b9c41ecd4ac2b7ca82f0b058cc4491540e55b20129" -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 0.13.1", - "serde", - "serde_json", - "serde_repr", - "serialize-to-javascript", - "swift-rs", - "tauri-build", - "tauri-macros", - "tauri-runtime", - "tauri-runtime-wry", - "tauri-utils", - "thiserror 2.0.18", - "tokio", - "tray-icon", - "url", - "webkit2gtk", - "webview2-com", - "window-vibrancy", - "windows", -] - -[[package]] -name = "tauri-build" -version = "2.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca7bd893329425df750813e95bd2b643d5369d929438da96d5bbb7cc2c918f74" -dependencies = [ - "anyhow", - "cargo_toml", - "dirs", - "glob", - "heck 0.5.0", - "json-patch", - "schemars 0.8.22", - "semver", - "serde", - "serde_json", - "tauri-utils", - "tauri-winres", - "toml 0.9.11+spec-1.1.0", - "walkdir", -] - -[[package]] -name = "tauri-codegen" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac423e5859d9f9ccdd32e3cf6a5866a15bedbf25aa6630bcb2acde9468f6ae3" -dependencies = [ - "base64 0.22.1", - "brotli", - "ico", - "json-patch", - "plist", - "png", - "proc-macro2", - "quote", - "semver", - "serde", - "serde_json", - "sha2", - "syn 2.0.114", - "tauri-utils", - "thiserror 2.0.18", - "time", - "url", - "uuid", - "walkdir", -] - -[[package]] -name = "tauri-macros" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6a1bd2861ff0c8766b1d38b32a6a410f6dc6532d4ef534c47cfb2236092f59" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.114", - "tauri-codegen", - "tauri-utils", -] - -[[package]] -name = "tauri-plugin" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692a77abd8b8773e107a42ec0e05b767b8d2b7ece76ab36c6c3947e34df9f53f" -dependencies = [ - "anyhow", - "glob", - "plist", - "schemars 0.8.22", - "serde", - "serde_json", - "tauri-utils", - "toml 0.9.11+spec-1.1.0", - "walkdir", -] - -[[package]] -name = "tauri-plugin-log" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7545bd67f070a4500432c826e2e0682146a1d6712aee22a2786490156b574d93" -dependencies = [ - "android_logger", - "byte-unit", - "fern", - "log", - "objc2", - "objc2-foundation", - "serde", - "serde_json", - "serde_repr", - "swift-rs", - "tauri", - "tauri-plugin", - "thiserror 2.0.18", - "time", -] - -[[package]] -name = "tauri-plugin-shell" -version = "2.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8457dbf9e2bab1edd8df22bb2c20857a59a9868e79cb3eac5ed639eec4d0c73b" -dependencies = [ - "encoding_rs", - "log", - "open", - "os_pipe", - "regex", - "schemars 0.8.22", - "serde", - "serde_json", - "shared_child", - "tauri", - "tauri-plugin", - "thiserror 2.0.18", - "tokio", -] - -[[package]] -name = "tauri-runtime" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b885ffeac82b00f1f6fd292b6e5aabfa7435d537cef57d11e38a489956535651" -dependencies = [ - "cookie", - "dpi", - "gtk", - "http", - "jni", - "objc2", - "objc2-ui-kit", - "objc2-web-kit", - "raw-window-handle", - "serde", - "serde_json", - "tauri-utils", - "thiserror 2.0.18", - "url", - "webkit2gtk", - "webview2-com", - "windows", -] - -[[package]] -name = "tauri-runtime-wry" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5204682391625e867d16584fedc83fc292fb998814c9f7918605c789cd876314" -dependencies = [ - "gtk", - "http", - "jni", - "log", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "once_cell", - "percent-encoding", - "raw-window-handle", - "softbuffer", - "tao", - "tauri-runtime", - "tauri-utils", - "url", - "webkit2gtk", - "webview2-com", - "windows", - "wry", -] - -[[package]] -name = "tauri-utils" -version = "2.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcd169fccdff05eff2c1033210b9b94acd07a47e6fa9a3431cf09cfd4f01c87e" -dependencies = [ - "anyhow", - "brotli", - "cargo_metadata", - "ctor", - "dunce", - "glob", - "html5ever", - "http", - "infer", - "json-patch", - "kuchikiki", - "log", - "memchr", - "phf 0.11.3", - "proc-macro2", - "quote", - "regex", - "schemars 0.8.22", - "semver", - "serde", - "serde-untagged", - "serde_json", - "serde_with", - "swift-rs", - "thiserror 2.0.18", - "toml 0.9.11+spec-1.1.0", - "url", - "urlpattern", - "uuid", - "walkdir", -] - -[[package]] -name = "tauri-winres" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" -dependencies = [ - "dunce", - "embed-resource", - "toml 0.9.11+spec-1.1.0", -] - -[[package]] -name = "tempfile" -version = "3.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" -dependencies = [ - "fastrand", - "getrandom 0.3.4", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "tendril" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" -dependencies = [ - "futf", - "mac", - "utf-8", -] - -[[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.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[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.114", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "time" -version = "0.3.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" -dependencies = [ - "deranged", - "itoa", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" - -[[package]] -name = "time-macros" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -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 = "0.9.11+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" -dependencies = [ - "indexmap 2.13.0", - "serde_core", - "serde_spanned 1.0.4", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 0.7.14", -] - -[[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 = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -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.13.0", - "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.13.0", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.23.10+spec-1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" -dependencies = [ - "indexmap 2.13.0", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "winnow 0.7.14", -] - -[[package]] -name = "toml_parser" -version = "1.0.6+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" -dependencies = [ - "winnow 0.7.14", -] - -[[package]] -name = "toml_writer" -version = "1.0.6+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" - -[[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", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" -dependencies = [ - "bitflags 2.10.0", - "bytes", - "http", - "http-body", - "http-body-util", - "pin-project-lite", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" -dependencies = [ - "bitflags 2.10.0", - "bytes", - "futures-util", - "http", - "http-body", - "iri-string", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", -] - -[[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 = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[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.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" -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.18", - "windows-sys 0.60.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.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-ucd-ident" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - -[[package]] -name = "unicode-ident" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" - -[[package]] -name = "unicode-normalization" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-properties" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[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.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" -dependencies = [ - "regex", - "serde", - "unic-ucd-ident", - "url", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8-width" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "1.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" -dependencies = [ - "getrandom 0.3.4", - "js-sys", - "serde_core", - "wasm-bindgen", -] - -[[package]] -name = "value-bag" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[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.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" -dependencies = [ - "cfg-if", - "futures-util", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.114", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[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 = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.6", -] - -[[package]] -name = "webpki-roots" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webview2-com" -version = "0.38.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" -dependencies = [ - "webview2-com-macros", - "webview2-com-sys", - "windows", - "windows-core 0.61.2", - "windows-implement", - "windows-interface", -] - -[[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.114", -] - -[[package]] -name = "webview2-com-sys" -version = "0.38.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" -dependencies = [ - "thiserror 2.0.18", - "windows", - "windows-core 0.61.2", -] - -[[package]] -name = "whoami" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" -dependencies = [ - "libredox", - "wasite", -] - -[[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.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" -dependencies = [ - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "raw-window-handle", - "windows-sys 0.59.0", - "windows-version", -] - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[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 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "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.114", -] - -[[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.114", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[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.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link 0.2.1", -] - -[[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.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[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 0.2.1", -] - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "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.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-version" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" -dependencies = [ - "windows-link 0.2.1", -] - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[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.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[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.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[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 = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.55.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" -dependencies = [ - "cfg-if", - "windows-sys 0.59.0", -] - -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - -[[package]] -name = "wry" -version = "0.54.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed1a195b0375491dd15a7066a10251be217ce743cf4bbbbdcf5391d6473bee0" -dependencies = [ - "base64 0.22.1", - "block2", - "cookie", - "crossbeam-channel", - "dirs", - "dpi", - "dunce", - "gdkx11", - "gtk", - "html5ever", - "http", - "javascriptcore-rs", - "jni", - "kuchikiki", - "libc", - "ndk", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-ui-kit", - "objc2-web-kit", - "once_cell", - "percent-encoding", - "raw-window-handle", - "sha2", - "soup3", - "tao-macros", - "thiserror 2.0.18", - "url", - "webkit2gtk", - "webkit2gtk-sys", - "webview2-com", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[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 = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "zmij" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" diff --git a/src/backend/Cargo.toml b/src/backend/Cargo.toml deleted file mode 100644 index 2f8014e..0000000 --- a/src/backend/Cargo.toml +++ /dev/null @@ -1,38 +0,0 @@ -[package] -name = "app" -version = "0.1.1" -description = "A Tauri App" -authors = ["you"] -license = "" -repository = "" -edition = "2021" -rust-version = "1.77.2" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -name = "app_lib" -crate-type = ["staticlib", "cdylib", "rlib"] - -[build-dependencies] -tauri-build = { version = "2.5.4", features = [] } - -[dependencies] -serde_json = "1.0" -serde = { version = "1.0", features = ["derive"] } -log = "0.4" -tauri = { version = "2.10.0", features = ["tray-icon"] } -tauri-plugin-shell = "2" -tauri-plugin-log = "2" -rusqlite = { version = "0.32", features = ["load_extension", "bundled"] } -reqwest = { version = "0.12", features = ["json"] } -tokio = { version = "1", features = ["full"] } -axum = { version = "0.7" } -anyhow = "1.0" -tower-http = { version = "0.5", features = ["cors"] } -dotenvy = "0.15" -sea-orm = { version = "1.1", features = ["sqlx-sqlite", "runtime-tokio-rustls", "macros", "with-chrono"] } -futures = "0.3" - -[dev-dependencies] -mockito = "1.4" diff --git a/src/backend/build.rs b/src/backend/build.rs deleted file mode 100644 index d860e1e..0000000 --- a/src/backend/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - tauri_build::build() -} diff --git a/src/backend/capabilities/default.json b/src/backend/capabilities/default.json deleted file mode 100644 index 8436679..0000000 --- a/src/backend/capabilities/default.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "../gen/schemas/desktop-schema.json", - "identifier": "default", - "description": "enables the default permissions", - "windows": [ - "main" - ], - "permissions": [ - "core:default", - "shell:allow-spawn", - { - "identifier": "shell:allow-execute", - "allow": [ - { - "args": true, - "sidecar": true, - "name": "bin/llama-server" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/backend/src/db.rs b/src/backend/src/db.rs deleted file mode 100644 index be303ec..0000000 --- a/src/backend/src/db.rs +++ /dev/null @@ -1,73 +0,0 @@ -use sea_orm::{ConnectOptions, Database, DatabaseConnection}; -use std::time::Duration; - -pub async fn init_db(db_path: &str, extension_path: &str) -> anyhow::Result { - // SeaORM (sqlx) は URL 形式でパスを指定する - let db_url = format!("sqlite:{}?mode=rwc", db_path); - - let mut opt = ConnectOptions::new(db_url); - opt.max_connections(10) - .min_connections(5) - .connect_timeout(Duration::from_secs(8)) - .idle_timeout(Duration::from_secs(8)) - .max_lifetime(Duration::from_secs(8)) - .sqlx_logging(true); - - // 拡張機能のロードが必要なため、sqlx の初期化フックがあればいいが、 - // SeaORM/sqlx で動的にロードするのは少し工夫が必要。 - // ここではまず rusqlite か何かでスキーマ初期化と拡張ロードの確認をしてから SeaORM で繋ぐか、 - // sqlx の ConnectOptions にて初期化SQLを流す。 - - // NOTE: sqlite-vec のロードは非常に特殊なため、 - // 生の rusqlite で拡張をロードしてテーブルを作った後、SeaORM で接続する。 - { - use rusqlite::Connection; - let conn = Connection::open(db_path)?; - unsafe { - conn.load_extension(extension_path, None)?; - } - conn.execute_batch( - "PRAGMA journal_mode = WAL; - CREATE TABLE IF NOT EXISTS items ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - content TEXT NOT NULL, - path TEXT, - created_at TEXT DEFAULT (datetime('now', 'localtime')), - updated_at TEXT DEFAULT (datetime('now', 'localtime')) - ); - CREATE TRIGGER IF NOT EXISTS update_items_updated_at - AFTER UPDATE ON items - FOR EACH ROW - BEGIN - UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; - END; - CREATE VIRTUAL TABLE IF NOT EXISTS vec_items USING vec0( - id INTEGER PRIMARY KEY, - embedding FLOAT[384] - );", - )?; - } - - let db = Database::connect(opt).await?; - - // SeaORM の接続後にも拡張をロードしておく必要がある場合がある(セッション毎) - // sqlx-sqlite の場合、初期化 SQL でロードできるケースがあるが設定が複雑。 - // 今回は rusqlite での初期化を優先し、クエリ実行時に MATCH 句が動くか確認する。 - - Ok(db) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[tokio::test] - async fn test_init_db_basic() { - // NOTE: We test with a dummy extension path and expect it to fail if it's not found, - // or we test just the SeaORM part if we could separation. - // For now, let's just ensure we can connect to an in-memory sqlite via SeaORM. - let mut opt = ConnectOptions::new("sqlite::memory:"); - let db = Database::connect(opt).await; - assert!(db.is_ok()); - } -} diff --git a/src/backend/src/entities/items.rs b/src/backend/src/entities/items.rs deleted file mode 100644 index bfd6d83..0000000 --- a/src/backend/src/entities/items.rs +++ /dev/null @@ -1,18 +0,0 @@ -use sea_orm::entity::prelude::*; -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)] -#[sea_orm(table_name = "items")] -pub struct Model { - #[sea_orm(primary_key)] - pub id: i32, - pub content: String, - pub path: Option, - pub created_at: DateTimeLocal, - pub updated_at: DateTimeLocal, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/src/backend/src/entities/mod.rs b/src/backend/src/entities/mod.rs deleted file mode 100644 index 339b22d..0000000 --- a/src/backend/src/entities/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod items; diff --git a/src/backend/src/lib.rs b/src/backend/src/lib.rs deleted file mode 100644 index 7614a82..0000000 --- a/src/backend/src/lib.rs +++ /dev/null @@ -1,360 +0,0 @@ -pub mod db; -pub mod entities; -pub mod llama; -pub mod mcp; - -use crate::llama::LlamaClient; -use dotenvy::dotenv; -use sea_orm::DatabaseConnection; -use std::env; -use std::path::PathBuf; -use std::sync::Arc; -use tauri::menu::{Menu, MenuItem}; -use tauri::tray::{TrayIconBuilder, TrayIconEvent}; -use tauri::Manager; - -use std::sync::atomic::AtomicUsize; - -pub struct AppState { - pub db: DatabaseConnection, - pub llama: Arc, - pub mcp_tx: tokio::sync::broadcast::Sender, - pub connection_count: Arc, - pub app_handle: tauri::AppHandle, -} - -#[tauri::command] -fn get_mcp_info(app_handle: tauri::AppHandle) -> Result { - let mut candidates = vec![PathBuf::from("mcp.json")]; - - if let Ok(res_dir) = app_handle.path().resource_dir() { - candidates.push(res_dir.join("build_assets").join("mcp.json")); - } - - if let Ok(exe_path) = env::current_exe() { - if let Some(exe_dir) = exe_path.parent() { - let mut p = exe_dir.to_path_buf(); - for _ in 0..5 { - candidates.push(p.join("build_assets").join("mcp.json")); - if !p.pop() { break; } - } - } - } - - let mut found_path = None; - for candidate in &candidates { - log::info!("Checking mcp.json candidate: {:?}", candidate); - if candidate.exists() { - found_path = Some(candidate.clone()); - break; - } - } - let mcp_path = found_path.ok_or_else(|| format!("mcp.json not found. Checked: {:?}", candidates))?; - let content = std::fs::read_to_string(&mcp_path).map_err(|e| e.to_string())?; - let mcp_data: serde_json::Value = serde_json::from_str(&content).map_err(|e| e.to_string())?; - Ok(mcp_data) -} - -#[tauri::command] -async fn get_db_stats(state: tauri::State<'_, Arc>) -> Result { - use crate::entities::items; - use sea_orm::{EntityTrait, PaginatorTrait}; - let count = items::Entity::find().count(&state.db).await.map_err(|e| e.to_string())?; - Ok(serde_json::json!({ "itemCount": count })) -} - - -#[tauri::command] -async fn get_sidecar_status(state: tauri::State<'_, Arc>) -> Result { - Ok(state.llama.check_health().await) -} - -fn get_config(app_handle: &tauri::AppHandle) -> serde_json::Value { - let mut config_paths = vec![]; - if let Ok(app_data) = app_handle.path().app_config_dir() { config_paths.push(app_data.join("config.json")); } - if let Ok(exe_path) = env::current_exe() { - if let Some(exe_dir) = exe_path.parent() { - let mut p = exe_dir.to_path_buf(); - for _ in 0..5 { - config_paths.push(p.join("config.json")); - if !p.pop() { break; } - } - } - } - if let Ok(cwd) = env::current_dir() { config_paths.push(cwd.join("config.json")); } - if let Ok(res_dir) = app_handle.path().resource_dir() { - config_paths.push(res_dir.join("build_assets").join("config.json")); - } - - for path in config_paths { - log::info!("Checking config.json candidate: {:?}", path); - if path.exists() { - if let Ok(content) = std::fs::read_to_string(path) { - if let Ok(parsed) = serde_json::from_str::(&content) { return parsed; } - } - } - } - serde_json::json!({ - "database": { "path": "data/vector.db" }, - "model": { "path": "models/embeddinggemma-300m-q4_0.gguf" }, - "llama_server": { "port": 8080 } - }) -} - -fn resolve_db_path(app_handle: &tauri::AppHandle, config: &serde_json::Value) -> String { - if let Ok(p) = env::var("DB_PATH") { return p; } - if let Some(p) = config.get("database").and_then(|d| d.get("path")).and_then(|p| p.as_str()) { - let mut candidate = PathBuf::from(p); - if candidate.is_relative() { - if cfg!(debug_assertions) { - if let Ok(exe_path) = env::current_exe() { - if let Some(exe_dir) = exe_path.parent() { - let mut pr = exe_dir.to_path_buf(); - for _ in 0..4 { - if pr.join("config.json").exists() { candidate = pr.join(p); break; } - if !pr.pop() { break; } - } - } - } - } else { - let mut p_base = app_handle.path().app_data_dir().expect("App data dir not found"); - p_base.push("data"); - let _ = std::fs::create_dir_all(&p_base); - p_base.push("vector.db"); - candidate = p_base; - } - } - return candidate.to_string_lossy().to_string(); - } - - // Default fallback - if cfg!(debug_assertions) { "data/vector.db".to_string() } else { - let mut p = app_handle.path().app_data_dir().expect("App data dir not found"); - p.push("data"); - let _ = std::fs::create_dir_all(&p); - p.push("vector.db"); - p.to_string_lossy().to_string() - } -} - -fn resolve_extension_path(app_handle: &tauri::AppHandle) -> String { - let mut candidates = vec![]; - - if !cfg!(debug_assertions) { - if let Ok(res_dir) = app_handle.path().resource_dir() { - candidates.push(res_dir.join("build_assets").join("vec0.dll")); - } - } - - let exe_dir = env::current_exe().map(|p| p.parent().unwrap().to_path_buf()).unwrap_or_else(|_| env::current_dir().unwrap()); - candidates.push(exe_dir.join("vec0.dll")); - candidates.push(exe_dir.join("../node_modules/sqlite-vec-windows-x64/vec0.dll")); - candidates.push(exe_dir.join("../../node_modules/sqlite-vec-windows-x64/vec0.dll")); - candidates.push(exe_dir.join("../../../bin/vec0.dll")); - - for cand in &candidates { - if cand.exists() { - if let Ok(canon) = cand.canonicalize() { - let s = canon.to_string_lossy().to_string(); - if s.starts_with(r"\\?\") { - return s[4..].to_string(); - } - return s; - } - return cand.to_string_lossy().to_string(); - } - } - "vec0.dll".to_string() -} - -fn spawn_llama_server(app_handle: &tauri::AppHandle, _config: &serde_json::Value) { - use tauri_plugin_shell::ShellExt; - - // Use Tauri 2's sidecar API instead of manual Command spawning. - // This automatically handles executable naming (adding -x86_64-pc-windows-msvc etc.) - // and environment variables for DLL discovery in the sidecar folder. - let sidecar = match app_handle.shell().sidecar("llama-server") { - Ok(s) => s, - Err(e) => { - eprintln!("CRITICAL: Failed to create sidecar handle: {}", e); - return; - } - }; - - let res_dir = app_handle.path().resource_dir().unwrap_or_default(); - let exe_dir = std::env::current_exe() - .map(|p| p.parent().map(|parent| parent.to_path_buf()).unwrap_or_default()) - .unwrap_or_default(); - - // Preference: build_assets Dir in resDir - let build_assets_dir = res_dir.join("build_assets"); - let base_dir = if build_assets_dir.exists() { build_assets_dir } else { exe_dir.join("build_assets") }; - - // Model path should be in build_assets/models/ - let mut model_path = base_dir.join("models").join("embeddinggemma-300m-q4_0.gguf"); - if !model_path.exists() { - // Fallback or absolute path search if needed - model_path = base_dir.join("models").join("embeddinggemma-300m-q4_0.gguf"); - } - log::info!("Using base_dir for sidecar: {:?}", base_dir); - log::info!("Using model path for sidecar: {:?}", model_path); - - // Prepare arguments - let args = [ - "--model", model_path.to_str().unwrap_or(""), - "--port", "8080", - "--embedding", - "--host", "127.0.0.1", - "-c", "8192", "-b", "8192", "-ub", "8192", - "--parallel", "1" - ]; - - - // Diagnostic logging: List files in resource and exe directories - log::info!("Diagnostic: Resource Dir: {:?}", res_dir); - log::info!("Diagnostic: EXE Dir: {:?}", exe_dir); - - if let Ok(entries) = std::fs::read_dir(&res_dir) { - let files: Vec<_> = entries.filter_map(|e| e.ok().map(|entry| entry.file_name())).collect(); - log::info!("Diagnostic: Files in Resource Dir: {:?}", files); - } - if let Ok(entries) = std::fs::read_dir(&exe_dir) { - let files: Vec<_> = entries.filter_map(|e| e.ok().map(|entry| entry.file_name())).collect(); - log::info!("Diagnostic: Files in EXE Dir: {:?}", files); - } - - // Comprehensive PATH candidates - let old_path = std::env::var("PATH").unwrap_or_default(); - let mut path_candidates = vec![ - base_dir.display().to_string(), - ]; - - // Normalize paths to remove UNC prefix (\\?\) which can break some programs on Windows - let new_path = format!("{};{}", path_candidates.join(";"), old_path).replace("\\\\?\\", ""); - log::info!("Diagnostic: New Sidecar PATH (normalized): {}", new_path); - - let mut sidecar_cmd = sidecar.args(args).env("PATH", new_path); - - // Set current directory to the base_dir (where DLLs are) - if base_dir.exists() { - log::info!("Setting sidecar current_dir to: {:?}", base_dir); - sidecar_cmd = sidecar_cmd.current_dir(&base_dir); - } - - let (mut rx, _child) = match sidecar_cmd.spawn() { - Ok(res) => res, - Err(e) => { - log::error!("CRITICAL: Failed to spawn sidecar: {}", e); - return; - } - }; - - println!("llama-server started (Sidecar)"); - - // Handle output in background - tauri::async_runtime::spawn(async move { - while let Some(event) = rx.recv().await { - match event { - tauri_plugin_shell::process::CommandEvent::Stdout(line) => { - let s = String::from_utf8_lossy(&line); - if s.contains("HTTP server listening") { - println!("llama-server: Ready"); - } - } - tauri_plugin_shell::process::CommandEvent::Stderr(line) => { - eprintln!("llama-server error: {}", String::from_utf8_lossy(&line)); - } - tauri_plugin_shell::process::CommandEvent::Terminated(status) => { - println!("llama-server terminated with status: {:?}", status.code); - break; - } - _ => {} - } - } - }); -} - -#[cfg_attr(mobile, tauri::mobile_entry_point)] -pub fn run() { - tauri::Builder::default() - .plugin(tauri_plugin_shell::init()) - .on_window_event(|window, event| { - if let tauri::WindowEvent::CloseRequested { api, .. } = event { - api.prevent_close(); - let _ = window.hide(); - } - }) - .setup(|app| { - // 1. Initialize Logging FIRST for crash diagnostics - let mut log_builder = tauri_plugin_log::Builder::default() - .targets([ - tauri_plugin_log::Target::new(tauri_plugin_log::TargetKind::Stdout), - tauri_plugin_log::Target::new(tauri_plugin_log::TargetKind::LogDir { file_name: None }), - ]) - .max_file_size(10 * 1024 * 1024) - .level(log::LevelFilter::Info); - - if cfg!(debug_assertions) { - log_builder = log_builder.target(tauri_plugin_log::Target::new(tauri_plugin_log::TargetKind::Folder { path: std::path::PathBuf::from("logs"), file_name: None })); - } - let _ = app.handle().plugin(log_builder.build()); - log::info!("Application starting (Tauri 2)..."); - - // 2. Load env - dotenv().ok(); - let app_handle = app.handle().clone(); - - // 3. Start Sidecar - let config = get_config(&app_handle); - spawn_llama_server(&app_handle, &config); - - // 4. Database and MCP initialization - tauri::async_runtime::block_on(async move { - let db_path = resolve_db_path(&app_handle, &config); - let ext_path = resolve_extension_path(&app_handle); - log::info!("DB Path: {}, Ext Path: {}", db_path, ext_path); - - let vec_dim = env::var("VEC_DIM").unwrap_or_else(|_| "768".to_string()).parse::().unwrap_or(768); - let conn = db::init_db(&db_path, &ext_path, vec_dim).await.expect("Failed to init db"); - - let state = Arc::new(AppState { - db: conn, - llama: Arc::new(LlamaClient::new( - env::var("LLAMA_CPP_BASE_URL").unwrap_or_else(|_| "http://localhost:8080".to_string()), - env::var("LLAMA_CPP_EMBEDDING_MODEL").unwrap_or_else(|_| "nomic-embed-text".to_string()), - env::var("LLAMA_CPP_MODEL").unwrap_or_else(|_| "mistral".to_string()), - )), - mcp_tx: tokio::sync::broadcast::channel(100).0, - connection_count: Arc::new(AtomicUsize::new(0)), - app_handle: app_handle.clone(), - }); - app_handle.manage(state.clone()); - let port = env::var("MCP_PORT").unwrap_or_else(|_| "3000".to_string()).parse::().unwrap_or(3000); - tokio::spawn(async move { mcp::start_mcp_server(state, port).await; }); - }); - - // 5. Tray setup - let quit_i = MenuItem::with_id(app, "quit", "Quit", true, None::<&str>)?; - let show_i = MenuItem::with_id(app, "show", "Show", true, None::<&str>)?; - let menu = Menu::with_items(app, &[&show_i, &quit_i])?; - let _tray = TrayIconBuilder::new() - .icon(app.default_window_icon().unwrap().clone()) - .menu(&menu) - .on_menu_event(|app, event| match event.id.as_ref() { - "quit" => app.exit(0), - "show" => if let Some(w) = app.get_webview_window("main") { let _ = w.show(); let _ = w.set_focus(); } - _ => {} - }) - .on_tray_icon_event(|tray, event| if let TrayIconEvent::DoubleClick { .. } = event { - let app = tray.app_handle(); - if let Some(w) = app.get_webview_window("main") { let _ = w.show(); let _ = w.set_focus(); } - }) - .build(app)?; - - log::info!("Tauri setup completed"); - Ok(()) - }) - .invoke_handler(tauri::generate_handler![get_mcp_info, get_db_stats, get_sidecar_status]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); -} diff --git a/src/backend/src/llama.rs b/src/backend/src/llama.rs deleted file mode 100644 index e0f8e7e..0000000 --- a/src/backend/src/llama.rs +++ /dev/null @@ -1,150 +0,0 @@ -use anyhow::Result; -use reqwest::Client; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Serialize)] -struct EmbeddingRequest { - model: String, - input: String, -} - -#[derive(Debug, Deserialize)] -struct EmbeddingResponse { - data: Vec, -} - -#[derive(Debug, Deserialize)] -struct EmbeddingData { - embedding: Vec, -} - -#[derive(Debug, Serialize)] -struct CompletionRequest { - model: String, - prompt: String, - n_predict: i32, - temperature: f32, - stream: bool, -} - -#[derive(Debug, Deserialize)] -struct CompletionResponse { - content: String, -} - -pub struct LlamaClient { - client: Client, - base_url: String, - embedding_model: String, - completion_model: String, -} - -impl LlamaClient { - pub fn new(base_url: String, embedding_model: String, completion_model: String) -> Self { - Self { - client: Client::new(), - base_url, - embedding_model, - completion_model, - } - } - - pub async fn get_embedding(&self, text: &str) -> Result> { - let url = format!("{}/embeddings", self.base_url); - let req = EmbeddingRequest { - model: self.embedding_model.clone(), - input: text.to_string(), - }; - - let res = self - .client - .post(&url) - .json(&req) - .send() - .await? - .json::() - .await?; - - Ok(res.data[0].embedding.clone()) - } - - pub async fn completion( - &self, - prompt: &str, - n_predict: i32, - temperature: f32, - ) -> Result { - let url = format!("{}/completion", self.base_url); - let req = CompletionRequest { - model: self.completion_model.clone(), - prompt: prompt.to_string(), - n_predict, - temperature, - stream: false, - }; - - let res = self - .client - .post(&url) - .json(&req) - .send() - .await? - .json::() - .await?; - - Ok(res.content) - } - - pub async fn check_health(&self) -> bool { - let url = format!("{}/health", self.base_url); - self.client.get(&url).send().await.is_ok() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use mockito::Server; - - #[tokio::test] - async fn test_get_embedding() -> Result<()> { - let mut server = Server::new_async().await; - let url = server.url(); - - let mock = server - .mock("POST", "/embeddings") - .with_status(200) - .with_header("content-type", "application/json") - .with_body(r#"{"data":[{"embedding":[0.1, 0.2, 0.3]}]}"#) - .create_async() - .await; - - let client = LlamaClient::new(url, "test-model".to_string(), "test-model".to_string()); - let embedding = client.get_embedding("hello").await?; - - assert_eq!(embedding, vec![0.1, 0.2, 0.3]); - mock.assert_async().await; - Ok(()) - } - - #[tokio::test] - async fn test_completion() -> Result<()> { - let mut server = Server::new_async().await; - let url = server.url(); - - let mock = server - .mock("POST", "/completion") - .with_status(200) - .with_header("content-type", "application/json") - .with_body(r#"{"content":"Hello, world!"}"#) - .create_async() - .await; - - let client = LlamaClient::new(url, "test-model".to_string(), "test-model".to_string()); - let result = client.completion("hi", 10, 0.7).await?; - - assert_eq!(result, "Hello, world!"); - mock.assert_async().await; - Ok(()) - } -} diff --git a/src/backend/src/main.rs b/src/backend/src/main.rs deleted file mode 100644 index 69c3a72..0000000 --- a/src/backend/src/main.rs +++ /dev/null @@ -1,6 +0,0 @@ -// Prevents additional console window on Windows in release, DO NOT REMOVE!! -#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] - -fn main() { - app_lib::run(); -} diff --git a/src/backend/src/mcp.rs b/src/backend/src/mcp.rs deleted file mode 100644 index 41b28cb..0000000 --- a/src/backend/src/mcp.rs +++ /dev/null @@ -1,398 +0,0 @@ -use crate::entities::items; -use crate::AppState; -use axum::{ - extract::State, - response::sse::{Event, Sse}, - routing::{get, post}, - Json, Router, -}; -use futures::stream::{self, Stream}; -use sea_orm::*; -use serde::{Deserialize, Serialize}; -use std::convert::Infallible; -use std::sync::Arc; - -#[derive(Debug, Deserialize)] -pub struct JsonRpcRequest { - pub jsonrpc: String, - pub method: String, - pub params: serde_json::Value, - pub id: Option, -} - -#[derive(Debug, Serialize)] -pub struct JsonRpcResponse { - pub jsonrpc: String, - pub result: Option, - pub error: Option, - pub id: serde_json::Value, -} - -pub async fn start_mcp_server(state: Arc, port: u16) { - let app = Router::new() - .route("/sse", get(sse_handler)) - .route("/messages", post(message_handler)) - .with_state(state); - - let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{}", port)) - .await - .unwrap(); - axum::serve(listener, app).await.unwrap(); -} - -async fn sse_handler( - State(_state): State>, -) -> Sse>> { - // Basic SSE handler for MCP - // Real MCP SDK would send 'endpoint' event here - let stream = stream::once(async { Ok(Event::default().event("endpoint").data("/messages")) }); - - Sse::new(stream) -} - -pub async fn message_handler( - State(state): State>, - Json(payload): Json, -) -> Json { - let result = match payload.method.as_str() { - "tools/list" => Some(serde_json::json!({ - "tools": [ - { - "name": "add_item_text", - "description": "Add item from text", - "inputSchema": { - "type": "object", - "properties": { - "content": { "type": "string" }, - "path": { "type": "string" } - } - } - }, - { - "name": "search_text", - "description": "Search items by text", - "inputSchema": { - "type": "object", - "properties": { - "content": { "type": "string" }, - "limit": { "type": "number" } - } - } - }, - { - "name": "add_item", - "description": "Add item with vector", - "inputSchema": { - "type": "object", - "properties": { - "content": { "type": "string" }, - "vector": { "type": "array", "items": { "type": "number" } }, - "path": { "type": "string" } - } - } - }, - { - "name": "search_vector", - "description": "Search items by vector", - "inputSchema": { - "type": "object", - "properties": { - "vector": { "type": "array", "items": { "type": "number" } }, - "limit": { "type": "number" } - } - } - }, - { - "name": "llm_generate", - "description": "Generate text via LLM", - "inputSchema": { - "type": "object", - "properties": { - "prompt": { "type": "string" }, - "n_predict": { "type": "number" }, - "temperature": { "type": "number" } - } - } - } - ] - })), - "tools/call" => { - let tool_name = payload.params["name"].as_str().unwrap_or(""); - let args = &payload.params["arguments"]; - - match tool_name { - "add_item_text" => { - let content = args["content"].as_str().unwrap_or(""); - let path = args["path"].as_str().unwrap_or(""); - match handle_add_item_text(&state, content, path).await { - Ok(res) => Some(res), - Err(e) => { - return Json(JsonRpcResponse { - jsonrpc: "2.0".to_string(), - result: None, - error: Some( - serde_json::json!({ "code": -32000, "message": e.to_string() }), - ), - id: payload.id.unwrap_or(serde_json::Value::Null), - }) - } - } - } - "add_item" => { - let content = args["content"].as_str().unwrap_or(""); - let vector: Vec = args["vector"] - .as_array() - .unwrap_or(&vec![]) - .iter() - .map(|v| v.as_f64().unwrap_or(0.0) as f32) - .collect(); - let path = args["path"].as_str().unwrap_or(""); - match handle_add_item(&state, content, vector, path).await { - Ok(res) => Some(res), - Err(e) => { - return Json(JsonRpcResponse { - jsonrpc: "2.0".to_string(), - result: None, - error: Some( - serde_json::json!({ "code": -32000, "message": e.to_string() }), - ), - id: payload.id.unwrap_or(serde_json::Value::Null), - }) - } - } - } - "search_text" => { - let content = args["content"].as_str().unwrap_or(""); - let limit = args["limit"].as_u64().unwrap_or(10) as usize; - match handle_search_text(&state, content, limit).await { - Ok(res) => Some(res), - Err(e) => { - return Json(JsonRpcResponse { - jsonrpc: "2.0".to_string(), - result: None, - error: Some( - serde_json::json!({ "code": -32000, "message": e.to_string() }), - ), - id: payload.id.unwrap_or(serde_json::Value::Null), - }) - } - } - } - "search_vector" => { - let vector: Vec = args["vector"] - .as_array() - .unwrap_or(&vec![]) - .iter() - .map(|v| v.as_f64().unwrap_or(0.0) as f32) - .collect(); - let limit = args["limit"].as_u64().unwrap_or(10) as usize; - match handle_search_vector(&state, vector, limit).await { - Ok(res) => Some(res), - Err(e) => { - return Json(JsonRpcResponse { - jsonrpc: "2.0".to_string(), - result: None, - error: Some( - serde_json::json!({ "code": -32000, "message": e.to_string() }), - ), - id: payload.id.unwrap_or(serde_json::Value::Null), - }) - } - } - } - "llm_generate" => { - let prompt = args["prompt"].as_str().unwrap_or(""); - let n_predict = args["n_predict"].as_i64().unwrap_or(128) as i32; - let temperature = args["temperature"].as_f64().unwrap_or(0.7) as f32; - match handle_llm_generate(&state, prompt, n_predict, temperature).await { - Ok(res) => Some(res), - Err(e) => { - return Json(JsonRpcResponse { - jsonrpc: "2.0".to_string(), - result: None, - error: Some( - serde_json::json!({ "code": -32000, "message": e.to_string() }), - ), - id: payload.id.unwrap_or(serde_json::Value::Null), - }) - } - } - } - _ => Some(serde_json::json!({ "error": "Unknown tool" })), - } - } - _ => Some(serde_json::json!({ "error": "Method not found" })), - }; - - Json(JsonRpcResponse { - jsonrpc: "2.0".to_string(), - result, - error: None, - id: payload.id.unwrap_or(serde_json::Value::Null), - }) -} - -async fn handle_add_item_text( - state: &AppState, - content: &str, - path: &str, -) -> anyhow::Result { - let embedding = state.llama.get_embedding(content).await?; - - // SeaORM insert - let new_item = items::ActiveModel { - content: Set(content.to_owned()), - path: Set(Some(path.to_owned())), - ..Default::default() - }; - - let db = &state.db; - let res = new_item.insert(db).await?; - let id = res.id; - - // vec0 table insert (SeaORM raw SQL for now as it's a virtual table) - let embedding_bytes: Vec = embedding.iter().flat_map(|f| f.to_le_bytes()).collect(); - - db.execute(Statement::from_sql_and_values( - DatabaseBackend::Sqlite, - "INSERT INTO vec_items (id, embedding) VALUES (?, ?)", - [id.into(), embedding_bytes.into()], - )) - .await?; - - Ok(serde_json::json!({ - "content": [{ "type": "text", "text": format!("Added item with id {}", id) }] - })) -} - -async fn handle_add_item( - state: &AppState, - content: &str, - vector: Vec, - path: &str, -) -> anyhow::Result { - let db = &state.db; - - let new_item = items::ActiveModel { - content: Set(content.to_owned()), - path: Set(Some(path.to_owned())), - ..Default::default() - }; - let res = new_item.insert(db).await?; - let id = res.id; - - let embedding_bytes: Vec = vector.iter().flat_map(|f| f.to_le_bytes()).collect(); - - db.execute(Statement::from_sql_and_values( - DatabaseBackend::Sqlite, - "INSERT INTO vec_items (id, embedding) VALUES (?, ?)", - [id.into(), embedding_bytes.into()], - )) - .await?; - - Ok(serde_json::json!({ - "content": [{ "type": "text", "text": format!("Added item with id {}", id) }] - })) -} - -async fn handle_search_text( - state: &AppState, - content: &str, - limit: usize, -) -> anyhow::Result { - let embedding = state.llama.get_embedding(content).await?; - handle_search_vector(state, embedding, limit).await -} - -async fn handle_search_vector( - state: &AppState, - vector: Vec, - limit: usize, -) -> anyhow::Result { - let embedding_bytes: Vec = vector.iter().flat_map(|f| f.to_le_bytes()).collect(); - - let db = &state.db; - - // raw SQL query via SeaORM for vector search - let results = db - .query_all(Statement::from_sql_and_values( - DatabaseBackend::Sqlite, - "SELECT i.id, i.content, i.path, i.created_at, i.updated_at, v.distance - FROM vec_items v - JOIN items i ON v.id = i.id - WHERE embedding MATCH ? - ORDER BY distance - LIMIT ?", - [embedding_bytes.into(), (limit as i64).into()], - )) - .await?; - - let mut out = Vec::new(); - for res in results { - out.push(serde_json::json!({ - "id": res.try_get::("", "id").map_err(|e| anyhow::anyhow!(e))?, - "content": res.try_get::("", "content").map_err(|e| anyhow::anyhow!(e))?, - "path": res.try_get::>("", "path").map_err(|e| anyhow::anyhow!(e))?, - "created_at": res.try_get::("", "created_at").map_err(|e| anyhow::anyhow!(e))?, - "updated_at": res.try_get::("", "updated_at").map_err(|e| anyhow::anyhow!(e))?, - "distance": res.try_get::("", "distance").map_err(|e| anyhow::anyhow!(e))? - })); - } - - Ok(serde_json::json!({ - "content": [{ "type": "text", "text": serde_json::to_string_pretty(&out)? }] - })) -} - -async fn handle_llm_generate( - state: &AppState, - prompt: &str, - n_predict: i32, - temperature: f32, -) -> anyhow::Result { - let text = state - .llama - .completion(prompt, n_predict, temperature) - .await?; - Ok(serde_json::json!({ - "content": [{ "type": "text", "text": text }] - })) -} - -#[cfg(test)] -mod tests { - use super::*; - use serde_json::json; - - #[test] - fn test_list_tools_format() { - let req = JsonRpcRequest { - jsonrpc: "2.0".to_string(), - method: "tools/list".to_string(), - params: json!({}), - id: Some(json!(1)), - }; - assert_eq!(req.method, "tools/list"); - } - - #[test] - fn test_search_response_structure() { - let results = vec![json!({ - "id": 1, - "content": "test content", - "path": "/test/path", - "created_at": "2024-02-07 15:00:00", - "updated_at": "2024-02-07 15:00:00", - "distance": 0.1 - })]; - - let response_body = json!({ - "content": [{ "type": "text", "text": serde_json::to_string_pretty(&results).unwrap() }] - }); - - assert!(response_body.get("content").is_some()); - let text = response_body["content"][0]["text"].as_str().unwrap(); - assert!(text.contains("created_at")); - assert!(text.contains("2024-02-07 15:00:00")); - } -} diff --git a/src/backend/tauri.conf.json b/src/backend/tauri.conf.json deleted file mode 100644 index ed493b9..0000000 --- a/src/backend/tauri.conf.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "https://schema.tauri.app/config/2", - "productName": "sqlitevector", - "version": "0.1.1", - "identifier": "com.sqlitevector.app", - "build": { - "frontendDist": "../frontend", - "beforeDevCommand": "", - "beforeBuildCommand": "" - }, - "app": { - "windows": [ - { - "title": "SQLite Vector", - "width": 800, - "height": 600, - "resizable": true, - "fullscreen": false, - "visible": true - } - ], - "withGlobalTauri": true, - "security": { - "csp": null - } - }, - "bundle": { - "active": true, - "targets": "all", - "externalBin": ["../../bin/llama-server"], - "resources": ["build_assets/**/*"], - "icon": [ - "../../resources/icons/32x32.png", - "../../resources/icons/128x128.png", - "../../resources/icons/128x128@2x.png", - "../../resources/icons/icon.icns", - "../../resources/icons/icon.ico" - ] - } -} diff --git a/src/backend/tests/integration_test.rs b/src/backend/tests/integration_test.rs deleted file mode 100644 index 1e93d26..0000000 --- a/src/backend/tests/integration_test.rs +++ /dev/null @@ -1,86 +0,0 @@ -use app_lib::{db, llama::LlamaClient, mcp, AppState}; -use axum::extract::State; -use axum::Json; -use sea_orm::{ConnectionTrait, DatabaseBackend, DatabaseConnection, Statement}; -use serde_json::json; -use std::sync::Arc; - -#[tokio::test] -async fn test_mcp_integration_flow() { - // 1. Initialize DB (in-memory) - let conn = sea_orm::Database::connect("sqlite::memory:").await.unwrap(); - - // Create items table manually for the test - let db_backend = conn.get_database_backend(); - conn.execute( - db_backend.build( - sea_orm::sea_query::Table::create() - .table(app_lib::entities::items::Entity) - .if_not_exists() - .col( - sea_orm::sea_query::ColumnDef::new(app_lib::entities::items::Column::Id) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col( - sea_orm::sea_query::ColumnDef::new(app_lib::entities::items::Column::Content) - .string() - .not_null(), - ) - .col( - sea_orm::sea_query::ColumnDef::new(app_lib::entities::items::Column::Path) - .string(), - ) - .col( - sea_orm::sea_query::ColumnDef::new(app_lib::entities::items::Column::CreatedAt) - .string(), - ) - .col( - sea_orm::sea_query::ColumnDef::new(app_lib::entities::items::Column::UpdatedAt) - .string(), - ), - ), - ) - .await - .expect("Failed to create table"); - - // Create vec_items table (virtual) - might fail if vec0 extension is missing, - // so we handle it gracefully in the test or skip it. - // In this test, we just test the tool list and basic error handling which don't need vec0. - - let llama = LlamaClient::new( - "http://localhost:8080".to_string(), - "m".to_string(), - "m".to_string(), - ); - - let state = Arc::new(AppState { - db: conn, - llama: Arc::new(llama), - }); - - // 2. Test tools/list - let req = mcp::JsonRpcRequest { - jsonrpc: "2.0".to_string(), - method: "tools/list".to_string(), - params: json!({}), - id: Some(json!(1)), - }; - - let res = mcp::message_handler(State(state.clone()), Json(req)).await; - assert!(res.result.is_some()); - let tools = res.result.as_ref().unwrap()["tools"].as_array().unwrap(); - assert!(tools.len() >= 4); - - // 3. Test Unknown Tool - let req_unknown = mcp::JsonRpcRequest { - jsonrpc: "2.0".to_string(), - method: "tools/call".to_string(), - params: json!({"name": "unknown"}), - id: Some(json!(2)), - }; - let res_err = mcp::message_handler(State(state.clone()), Json(req_unknown)).await; - assert!(res_err.result.as_ref().unwrap()["error"] == "Unknown tool"); -} diff --git a/src/frontend/icon.ico b/src/frontend/icon.ico deleted file mode 100644 index 2ee0da8..0000000 --- a/src/frontend/icon.ico +++ /dev/null Binary files differ diff --git a/src/frontend/index.html b/src/frontend/index.html deleted file mode 100644 index 2d2c487..0000000 --- a/src/frontend/index.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - SQLite Vector MCP Server - - - - -

SQLite Vector MCP Server

-

- Status: Loading... | - Sidecar: Checking... | - Connected Clients: 0 | - Stored Items: 0 -

- -
-

MCP Configuration

-
Loading MCP configuration...
-
- - - - - \ No newline at end of file diff --git a/test/README.md b/test/README.md deleted file mode 100644 index 9bdb6e8..0000000 --- a/test/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# テストスイート概要 - -`test/` フォルダには、SQLite Vector MCP サーバーの包括的なテストスイートが含まれています。 - -## テストファイル構成 - -### 1. **setup.js** - テスト用ユーティリティ -- `createTestDb(dbName)` - テスト用データベースの作成 -- `cleanupTestDb(dbName)` - テスト用データベースのクリーンアップ -- `setTestEnv()` / `clearTestEnv()` - テスト環境変数の設定・クリア - -### 2. **db.test.js** - データベースモジュールテスト(5テスト) -- データベースファイルの作成確認 -- テーブルスキーマの正確性(id, content, path, created_at, updated_at) -- アイテムの挿入機能 -- アイテムの取得機能 -- タイムスタンプデフォルト値の検証 - -### 3. **mcp-tools.test.js** - MCPツール定義テスト(11テスト) -- 5つの必須ツールの存在確認(add_item_text, add_item, search_text, search_vector, llm_generate) -- ツール定義の構造検証(name, description, inputSchema) -- add_item_text のスキーマ検証 -- search_vector のベクトル次元検証(3次元) -- llm_generate のプロンプト欄検証 -- すべてのツールの有効性チェック - -### 4. **mcp-handlers.test.js** - MCPハンドラーテスト(6テスト) -- エンベッディング次元の検証ロジック -- 検索結果フィールド(content, path, created_at, updated_at)の完全性 -- アイテムの挿入と返却値検証 -- 類似度検索の機能確認 -- 空の検索結果の適切なハンドリング -- タイムスタンプの操作を通じた保存検証 - -### 5. **llama-client.test.js** - LLamaクライアントテスト(9テスト) -**llamaEmbedding():** -- data配列形式のレスポンス解析 -- 直接embedding欄のレスポンス解析 -- エラーレスポンスのハンドリング(500 ステータス) -- embedding配列の不足時のエラー処理 -- リクエストボディの正確性(model, input フィールド) - -**llamaCompletion():** -- レスポンス解析 -- オプション(temperature, n_predict)の引き渡し -- エラーレスポンスのハンドリング(503 ステータス) -- 環境変数(LLAMA_CPP_*)の使用確認 - -### 6. **integration.test.js** - 統合テスト(4テスト) -- 完全なアイテムライフサイクル(作成→取得) -- 複数アイテムとメタデータの処理 -- データ完全性の検証 -- 並行処理のようなシナリオの処理 - -## テスト実行方法 - -### 全テスト実行 -```bash -bun test -``` - -### 特定のテストモジュール実行 -```bash -bun test test/db.test.js # データベーステスト -bun test test/mcp-tools.test.js # ツール定義テスト -bun test test/mcp-handlers.test.js # ハンドラーテスト -bun test test/llama-client.test.js # LLamaクライアントテスト -bun test test/integration.test.js # 統合テスト -``` - -### package.json スクリプト -```bash -npm test # 全テスト実行 -npm run test:db # db テスト -npm run test:tools # tools テスト -npm run test:handlers # handlers テスト -npm run test:llama # llama テスト -npm run test:integration # integration テスト -npm run test:watch # ウォッチモード(ファイル変更時に再実行) -``` - -## テスト統計 - -- **総テスト数**: 35 -- **カバレッジ対象**: - - Database operations (schema, insert, retrieve) - - MCP tool definitions and validation - - LLama.cpp API integration - - Error handling - - Data integrity - -## テスト環境 - -- **テストランナー**: Bun built-in test framework (`bun:test`) -- **データベース**: `bun:sqlite` (Bun組込SQLite) -- **テストスタイル**: Assertion-based (expect statements) -- **実行時間**: ~250ms - -## 注記 - -- テスト実行時に `test-*.db` ファイルが一時的に作成されます -- テスト環境では本番の `better-sqlite3` の代わりに `bun:sqlite` を使用 -- 各テストは独立しており、データの競合を避けるため テーブルクリア処理を含みます diff --git a/test/db.test.js b/test/db.test.js deleted file mode 100644 index 8691041..0000000 --- a/test/db.test.js +++ /dev/null @@ -1,198 +0,0 @@ -import { afterEach, beforeEach, describe, expect, it } from "bun:test"; -import * as fs from "fs"; -import { cleanupTestDb, clearTestEnv, createTestDb, setTestEnv } from "./setup.js"; - -const TEST_DB = "test-vector.db"; - -describe("Database Module", () => { - beforeEach(() => { - setTestEnv(); - cleanupTestDb(TEST_DB); - }); - - afterEach(() => { - cleanupTestDb(TEST_DB); - clearTestEnv(); - }); - - it("should create database file", () => { - const db = createTestDb(TEST_DB); - db.close(); - expect(fs.existsSync(TEST_DB)).toBe(true); - }); - - it("should initialize items table with correct schema", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now', 'localtime')), - updated_at TEXT DEFAULT (datetime('now', 'localtime')) - ); - CREATE TRIGGER IF NOT EXISTS update_items_updated_at - AFTER UPDATE ON items - FOR EACH ROW - BEGIN - UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; - END; - `); - - // テーブルスキーマを確認 - const itemsSchema = db.prepare("PRAGMA table_info(items)").all(); - - expect(itemsSchema.length).toBe(5); - expect(itemsSchema[0].name).toBe("id"); - expect(itemsSchema[1].name).toBe("content"); - expect(itemsSchema[2].name).toBe("path"); - expect(itemsSchema[3].name).toBe("created_at"); - expect(itemsSchema[4].name).toBe("updated_at"); - - db.close(); - }); - - it("should insert item into items table", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now', 'localtime')), - updated_at TEXT DEFAULT (datetime('now', 'localtime')) - ); - CREATE TRIGGER IF NOT EXISTS update_items_updated_at - AFTER UPDATE ON items - FOR EACH ROW - BEGIN - UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; - END; - `); - - // 挿入 - const stmt = db.prepare(` - INSERT INTO items (content, path) VALUES (?, ?) - `); - stmt.run("test content", "/test/path"); - - // 確認 - const items = db.prepare("SELECT * FROM items").all(); - expect(items.length).toBe(1); - expect(items[0].content).toBe("test content"); - expect(items[0].path).toBe("/test/path"); - expect(items[0].created_at).not.toBeNull(); - expect(items[0].updated_at).not.toBeNull(); - - db.close(); - }); - - it("should retrieve items from database", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now', 'localtime')), - updated_at TEXT DEFAULT (datetime('now', 'localtime')) - ); - CREATE TRIGGER IF NOT EXISTS update_items_updated_at - AFTER UPDATE ON items - FOR EACH ROW - BEGIN - UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; - END; - DELETE FROM items; - `); - - // 複数アイテムを挿入 - const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)"); - stmt.run("item 1", "/path/1"); - stmt.run("item 2", "/path/2"); - stmt.run("item 3", "/path/3"); - - // 取得 - const items = db.prepare("SELECT * FROM items").all(); - expect(items.length).toBe(3); - expect(items[0].content).toBe("item 1"); - expect(items[1].content).toBe("item 2"); - expect(items[2].content).toBe("item 3"); - - db.close(); - }); - - it("should handle datetime defaults", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now', 'localtime')), - updated_at TEXT DEFAULT (datetime('now', 'localtime')) - ); - CREATE TRIGGER IF NOT EXISTS update_items_updated_at - AFTER UPDATE ON items - FOR EACH ROW - BEGIN - UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; - END; - `); - - const stmt = db.prepare("INSERT INTO items (content) VALUES (?)"); - stmt.run("test"); - - const items = db.prepare("SELECT created_at, updated_at FROM items").all(); - - expect(items[0].created_at).toBeTruthy(); - expect(items[0].updated_at).toBeTruthy(); - expect(items[0].created_at).toMatch(/\d{4}-\d{2}-\d{2}/); - - db.close(); - }); - - it("should update updated_at automatically on update", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now', 'localtime')), - updated_at TEXT DEFAULT (datetime('now', 'localtime')) - ); - CREATE TRIGGER IF NOT EXISTS update_items_updated_at - AFTER UPDATE ON items - FOR EACH ROW - BEGIN - UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; - END; - `); - - const insertStmt = db.prepare("INSERT INTO items (content) VALUES (?)"); - insertStmt.run("initial content"); - - const itemBefore = db.prepare("SELECT * FROM items").get(); - const originalUpdateAt = itemBefore.updated_at; - - // 少し待機(秒単位の精度なので更新がわかるように) - // NOTE: SQLiteのdatetime('now')は秒単位なので、同じ秒に更新されると変わらない可能性があるが、通常は問題ない - - const updateStmt = db.prepare("UPDATE items SET content = ? WHERE id = ?"); - updateStmt.run("updated content", itemBefore.id); - - const itemAfter = db.prepare("SELECT * FROM items").get(); - - expect(itemAfter.content).toBe("updated content"); - // 本来は時間が進むのを待つべきだが、トリガーが呼ばれていることの検証とする - expect(itemAfter.updated_at).toBeTruthy(); - - db.close(); - }); -}); diff --git a/test/integration.test.js b/test/integration.test.js deleted file mode 100644 index 8015290..0000000 --- a/test/integration.test.js +++ /dev/null @@ -1,152 +0,0 @@ -import { afterEach, beforeEach, describe, expect, it } from "bun:test"; -import { cleanupTestDb, clearTestEnv, createTestDb, setTestEnv } from "./setup.js"; - -const TEST_DB = "test-vector-integration.db"; - -describe("Integration Tests", () => { - beforeEach(() => { - setTestEnv(); - cleanupTestDb(TEST_DB); - }); - - afterEach(() => { - cleanupTestDb(TEST_DB); - clearTestEnv(); - }); - - it("should complete full item lifecycle", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now')), - updated_at TEXT DEFAULT (datetime('now')) - ); - `); - - const content = "This is a test document"; - const path = "/documents/test.txt"; - - const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)"); - stmt.run(content, path); - - let items = db.prepare("SELECT * FROM items").all(); - expect(items.length).toBe(1); - expect(items[0].content).toBe(content); - expect(items[0].path).toBe(path); - const itemId = items[0].id; - - const results = db - .prepare(` - SELECT id, content, path, created_at, updated_at - FROM items - WHERE id = ? - `) - .all(itemId); - - expect(results.length).toBe(1); - expect(results[0].content).toBe(content); - expect(results[0].path).toBe(path); - expect(results[0].created_at).toBeTruthy(); - expect(results[0].updated_at).toBeTruthy(); - - db.close(); - }); - - it("should handle multiple items with different metadata", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now')), - updated_at TEXT DEFAULT (datetime('now')) - ); - DELETE FROM items; - `); - - const testData = [ - { content: "apple", path: "/fruits/apple.txt" }, - { content: "banana", path: "/fruits/banana.txt" }, - { content: "orange", path: "/fruits/orange.txt" }, - ]; - - const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)"); - testData.forEach((data) => { - stmt.run(data.content, data.path); - }); - - const allItems = db.prepare("SELECT * FROM items").all(); - expect(allItems.length).toBe(3); - - expect(allItems[0].path).toBe("/fruits/apple.txt"); - expect(allItems[1].path).toBe("/fruits/banana.txt"); - expect(allItems[2].path).toBe("/fruits/orange.txt"); - - db.close(); - }); - - it("should validate data integrity", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now')), - updated_at TEXT DEFAULT (datetime('now')) - ); - DELETE FROM items; - `); - - const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)"); - for (let i = 1; i <= 5; i++) { - stmt.run(`item ${i}`, `/path/${i}`); - } - - const items = db.prepare("SELECT COUNT(*) as cnt FROM items").all()[0]; - expect(items.cnt).toBe(5); - - const timestampedItems = db.prepare( - "SELECT id, content, created_at, updated_at FROM items" - ).all(); - - timestampedItems.forEach((item) => { - expect(item.created_at).toBeTruthy(); - expect(item.updated_at).toBeTruthy(); - }); - - db.close(); - }); - - it("should handle concurrent-like operations", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now')), - updated_at TEXT DEFAULT (datetime('now')) - ); - DELETE FROM items; - `); - - const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)"); - for (let i = 0; i < 10; i++) { - stmt.run(`content ${i}`, `/path/${i}`); - } - - const result = db.prepare("SELECT COUNT(*) as cnt FROM items").all()[0]; - expect(result.cnt).toBe(10); - - db.close(); - }); -}); diff --git a/test/mcp-handlers.test.js b/test/mcp-handlers.test.js deleted file mode 100644 index c861b14..0000000 --- a/test/mcp-handlers.test.js +++ /dev/null @@ -1,166 +0,0 @@ -import { afterEach, beforeEach, describe, expect, it } from "bun:test"; -import { cleanupTestDb, clearTestEnv, createTestDb, setTestEnv } from "./setup.js"; - -const TEST_DB = "test-vector.db"; - -describe("MCP Handlers Module", () => { - beforeEach(() => { - setTestEnv(); - cleanupTestDb(TEST_DB); - }); - - afterEach(() => { - cleanupTestDb(TEST_DB); - clearTestEnv(); - }); - - it("should validate embedding dimension correctly", () => { - const testVectors = [ - { dim: 384, valid: true }, - { dim: 2, valid: false }, - { dim: 385, valid: false }, - ]; - - const EMBEDDING_DIM = Number(process.env.VEC_DIM ?? 384); - - testVectors.forEach(({ dim, valid }) => { - const vector = new Array(dim).fill(0.5); - const isValid = vector.length === EMBEDDING_DIM; - expect(isValid).toBe(valid); - }); - }); - - it("should handle search results with all required fields", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now')), - updated_at TEXT DEFAULT (datetime('now')) - ); - `); - - const stmt = db.prepare(` - INSERT INTO items (content, path) VALUES (?, ?) - `); - stmt.run("test content", "/test/path"); - - const results = db - .prepare(` - SELECT content, path, created_at, updated_at - FROM items - WHERE id = ? - `) - .all(1); - - expect(results.length).toBe(1); - const result = results[0]; - expect(result.content).toBe("test content"); - expect(result.path).toBe("/test/path"); - expect(result.created_at).toBeTruthy(); - expect(result.updated_at).toBeTruthy(); - - db.close(); - }); - - it("should insert item and return id", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now')), - updated_at TEXT DEFAULT (datetime('now')) - ); - DELETE FROM items; - `); - - const stmt = db.prepare(` - INSERT INTO items (content, path) VALUES (?, ?) - `); - stmt.run("inserted content", "/inserted/path"); - - const items = db.prepare("SELECT * FROM items").all(); - expect(items.length).toBe(1); - expect(items[0].content).toBe("inserted content"); - expect(items[0].path).toBe("/inserted/path"); - - db.close(); - }); - - it("should perform similarity search", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now')), - updated_at TEXT DEFAULT (datetime('now')) - ); - DELETE FROM items; - `); - - const stmt = db.prepare("INSERT INTO items (content) VALUES (?)"); - stmt.run("item 1"); - stmt.run("item 2"); - stmt.run("item 3"); - - const items = db.prepare("SELECT * FROM items").all(); - expect(items.length).toBe(3); - - db.close(); - }); - - it("should handle empty results gracefully", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now')), - updated_at TEXT DEFAULT (datetime('now')) - ); - `); - - const results = db - .prepare("SELECT * FROM items WHERE content LIKE ?") - .all("%nonexistent%"); - - expect(results).toEqual([]); - - db.close(); - }); - - it("should preserve timestamps across operations", () => { - const db = createTestDb(TEST_DB); - - db.exec(` - CREATE TABLE if not exists items ( - id INTEGER PRIMARY KEY, - content TEXT, - path TEXT, - created_at TEXT DEFAULT (datetime('now')), - updated_at TEXT DEFAULT (datetime('now')) - ); - `); - - const stmt = db.prepare("INSERT INTO items (content) VALUES (?)"); - stmt.run("test"); - - const items = db.prepare("SELECT created_at, updated_at FROM items").all(); - expect(items[0].created_at).toBeTruthy(); - expect(items[0].updated_at).toBeTruthy(); - expect(items[0].created_at).toMatch(/\d{4}-\d{2}-\d{2}/); - - db.close(); - }); -}); diff --git a/test/scripts.test.js b/test/scripts.test.js deleted file mode 100644 index bab0e0d..0000000 --- a/test/scripts.test.js +++ /dev/null @@ -1,58 +0,0 @@ -import { describe, expect, test } from "bun:test"; -import { spawnSync } from "child_process"; -import fs from "fs"; -import path from "path"; - -const TMP_TEST_DIR = "test/tmp_scripts"; - -describe("Scripts Rust Support Test", () => { - // テスト用ディレクトリ作成 - if (!fs.existsSync(TMP_TEST_DIR)) { - fs.mkdirSync(TMP_TEST_DIR, { recursive: true }); - } - - test("analyze_nesting.js identifies deep nesting in Rust", () => { - const rustCode = ` - fn nested() { - if true { - if true { - if true { - match Some(1) { - Some(_) => { - println!("Deep!"); - } - None => {} - } - } - } - } - } - `; - const testFile = path.join(TMP_TEST_DIR, "test_deep.rs"); - fs.writeFileSync(testFile, rustCode); - - const result = spawnSync("node", ["scripts/analyze_nesting.js", testFile], { encoding: "utf-8" }); - expect(result.stdout).toContain("Level 5"); - expect(result.stdout).toContain("REFACTOR NEEDED"); - }); - - test("count_lines.js counts logical lines in Rust properly", () => { - const rustCode = ` - // Comment - fn main() { - /* Block - Comment */ - let x = 1; - - println!("{}", x); - } - `; - const testFile = path.join(TMP_TEST_DIR, "test_count.rs"); - fs.writeFileSync(testFile, rustCode); - - const result = spawnSync("node", ["scripts/count_lines.js", testFile], { encoding: "utf-8" }); - // fn main, let x, println, } = 4 logical lines (概算) - // 実際の実装にあわせたアサーション - expect(result.stdout).toContain("Logical : 4"); - }); -}); diff --git a/test/setup.js b/test/setup.js deleted file mode 100644 index a723c8a..0000000 --- a/test/setup.js +++ /dev/null @@ -1,45 +0,0 @@ -import Database from "bun:sqlite"; -import * as fs from "fs"; - -// テスト用データベースのセットアップ -export function createTestDb(dbName = "test-vector.db") { - // 既存のテストDBを削除 - try { - if (fs.existsSync(dbName)) { - fs.unlinkSync(dbName); - } - } catch (err) { - // ロックされているファイルは無視して続行 - } - - const db = new Database(dbName); - return db; -} - -// テスト用データベースのクリーンアップ -export function cleanupTestDb(dbName = "test-vector.db") { - try { - if (fs.existsSync(dbName)) { - fs.unlinkSync(dbName); - } - } catch (err) { - // ファイルがロックされている場合も無視 - console.warn(`Failed to clean up ${dbName}: ${err.message}`); - } -} - -// テスト用環境変数の設定 -export function setTestEnv() { - process.env.VEC_DIM = "384"; - process.env.LLAMA_CPP_BASE_URL = "http://127.0.0.1:8080"; - process.env.LLAMA_CPP_EMBEDDING_MODEL = "nomic-embed-text"; - process.env.LLAMA_CPP_MODEL = "mistral"; -} - -// テスト用環境変数のクリア -export function clearTestEnv() { - delete process.env.VEC_DIM; - delete process.env.LLAMA_CPP_BASE_URL; - delete process.env.LLAMA_CPP_EMBEDDING_MODEL; - delete process.env.LLAMA_CPP_MODEL; -} diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..9bdb6e8 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,103 @@ +# テストスイート概要 + +`test/` フォルダには、SQLite Vector MCP サーバーの包括的なテストスイートが含まれています。 + +## テストファイル構成 + +### 1. **setup.js** - テスト用ユーティリティ +- `createTestDb(dbName)` - テスト用データベースの作成 +- `cleanupTestDb(dbName)` - テスト用データベースのクリーンアップ +- `setTestEnv()` / `clearTestEnv()` - テスト環境変数の設定・クリア + +### 2. **db.test.js** - データベースモジュールテスト(5テスト) +- データベースファイルの作成確認 +- テーブルスキーマの正確性(id, content, path, created_at, updated_at) +- アイテムの挿入機能 +- アイテムの取得機能 +- タイムスタンプデフォルト値の検証 + +### 3. **mcp-tools.test.js** - MCPツール定義テスト(11テスト) +- 5つの必須ツールの存在確認(add_item_text, add_item, search_text, search_vector, llm_generate) +- ツール定義の構造検証(name, description, inputSchema) +- add_item_text のスキーマ検証 +- search_vector のベクトル次元検証(3次元) +- llm_generate のプロンプト欄検証 +- すべてのツールの有効性チェック + +### 4. **mcp-handlers.test.js** - MCPハンドラーテスト(6テスト) +- エンベッディング次元の検証ロジック +- 検索結果フィールド(content, path, created_at, updated_at)の完全性 +- アイテムの挿入と返却値検証 +- 類似度検索の機能確認 +- 空の検索結果の適切なハンドリング +- タイムスタンプの操作を通じた保存検証 + +### 5. **llama-client.test.js** - LLamaクライアントテスト(9テスト) +**llamaEmbedding():** +- data配列形式のレスポンス解析 +- 直接embedding欄のレスポンス解析 +- エラーレスポンスのハンドリング(500 ステータス) +- embedding配列の不足時のエラー処理 +- リクエストボディの正確性(model, input フィールド) + +**llamaCompletion():** +- レスポンス解析 +- オプション(temperature, n_predict)の引き渡し +- エラーレスポンスのハンドリング(503 ステータス) +- 環境変数(LLAMA_CPP_*)の使用確認 + +### 6. **integration.test.js** - 統合テスト(4テスト) +- 完全なアイテムライフサイクル(作成→取得) +- 複数アイテムとメタデータの処理 +- データ完全性の検証 +- 並行処理のようなシナリオの処理 + +## テスト実行方法 + +### 全テスト実行 +```bash +bun test +``` + +### 特定のテストモジュール実行 +```bash +bun test test/db.test.js # データベーステスト +bun test test/mcp-tools.test.js # ツール定義テスト +bun test test/mcp-handlers.test.js # ハンドラーテスト +bun test test/llama-client.test.js # LLamaクライアントテスト +bun test test/integration.test.js # 統合テスト +``` + +### package.json スクリプト +```bash +npm test # 全テスト実行 +npm run test:db # db テスト +npm run test:tools # tools テスト +npm run test:handlers # handlers テスト +npm run test:llama # llama テスト +npm run test:integration # integration テスト +npm run test:watch # ウォッチモード(ファイル変更時に再実行) +``` + +## テスト統計 + +- **総テスト数**: 35 +- **カバレッジ対象**: + - Database operations (schema, insert, retrieve) + - MCP tool definitions and validation + - LLama.cpp API integration + - Error handling + - Data integrity + +## テスト環境 + +- **テストランナー**: Bun built-in test framework (`bun:test`) +- **データベース**: `bun:sqlite` (Bun組込SQLite) +- **テストスタイル**: Assertion-based (expect statements) +- **実行時間**: ~250ms + +## 注記 + +- テスト実行時に `test-*.db` ファイルが一時的に作成されます +- テスト環境では本番の `better-sqlite3` の代わりに `bun:sqlite` を使用 +- 各テストは独立しており、データの競合を避けるため テーブルクリア処理を含みます diff --git a/tests/db.test.js b/tests/db.test.js new file mode 100644 index 0000000..8691041 --- /dev/null +++ b/tests/db.test.js @@ -0,0 +1,198 @@ +import { afterEach, beforeEach, describe, expect, it } from "bun:test"; +import * as fs from "fs"; +import { cleanupTestDb, clearTestEnv, createTestDb, setTestEnv } from "./setup.js"; + +const TEST_DB = "test-vector.db"; + +describe("Database Module", () => { + beforeEach(() => { + setTestEnv(); + cleanupTestDb(TEST_DB); + }); + + afterEach(() => { + cleanupTestDb(TEST_DB); + clearTestEnv(); + }); + + it("should create database file", () => { + const db = createTestDb(TEST_DB); + db.close(); + expect(fs.existsSync(TEST_DB)).toBe(true); + }); + + it("should initialize items table with correct schema", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now', 'localtime')), + updated_at TEXT DEFAULT (datetime('now', 'localtime')) + ); + CREATE TRIGGER IF NOT EXISTS update_items_updated_at + AFTER UPDATE ON items + FOR EACH ROW + BEGIN + UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; + END; + `); + + // テーブルスキーマを確認 + const itemsSchema = db.prepare("PRAGMA table_info(items)").all(); + + expect(itemsSchema.length).toBe(5); + expect(itemsSchema[0].name).toBe("id"); + expect(itemsSchema[1].name).toBe("content"); + expect(itemsSchema[2].name).toBe("path"); + expect(itemsSchema[3].name).toBe("created_at"); + expect(itemsSchema[4].name).toBe("updated_at"); + + db.close(); + }); + + it("should insert item into items table", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now', 'localtime')), + updated_at TEXT DEFAULT (datetime('now', 'localtime')) + ); + CREATE TRIGGER IF NOT EXISTS update_items_updated_at + AFTER UPDATE ON items + FOR EACH ROW + BEGIN + UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; + END; + `); + + // 挿入 + const stmt = db.prepare(` + INSERT INTO items (content, path) VALUES (?, ?) + `); + stmt.run("test content", "/test/path"); + + // 確認 + const items = db.prepare("SELECT * FROM items").all(); + expect(items.length).toBe(1); + expect(items[0].content).toBe("test content"); + expect(items[0].path).toBe("/test/path"); + expect(items[0].created_at).not.toBeNull(); + expect(items[0].updated_at).not.toBeNull(); + + db.close(); + }); + + it("should retrieve items from database", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now', 'localtime')), + updated_at TEXT DEFAULT (datetime('now', 'localtime')) + ); + CREATE TRIGGER IF NOT EXISTS update_items_updated_at + AFTER UPDATE ON items + FOR EACH ROW + BEGIN + UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; + END; + DELETE FROM items; + `); + + // 複数アイテムを挿入 + const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)"); + stmt.run("item 1", "/path/1"); + stmt.run("item 2", "/path/2"); + stmt.run("item 3", "/path/3"); + + // 取得 + const items = db.prepare("SELECT * FROM items").all(); + expect(items.length).toBe(3); + expect(items[0].content).toBe("item 1"); + expect(items[1].content).toBe("item 2"); + expect(items[2].content).toBe("item 3"); + + db.close(); + }); + + it("should handle datetime defaults", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now', 'localtime')), + updated_at TEXT DEFAULT (datetime('now', 'localtime')) + ); + CREATE TRIGGER IF NOT EXISTS update_items_updated_at + AFTER UPDATE ON items + FOR EACH ROW + BEGIN + UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; + END; + `); + + const stmt = db.prepare("INSERT INTO items (content) VALUES (?)"); + stmt.run("test"); + + const items = db.prepare("SELECT created_at, updated_at FROM items").all(); + + expect(items[0].created_at).toBeTruthy(); + expect(items[0].updated_at).toBeTruthy(); + expect(items[0].created_at).toMatch(/\d{4}-\d{2}-\d{2}/); + + db.close(); + }); + + it("should update updated_at automatically on update", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now', 'localtime')), + updated_at TEXT DEFAULT (datetime('now', 'localtime')) + ); + CREATE TRIGGER IF NOT EXISTS update_items_updated_at + AFTER UPDATE ON items + FOR EACH ROW + BEGIN + UPDATE items SET updated_at = datetime('now', 'localtime') WHERE id = OLD.id; + END; + `); + + const insertStmt = db.prepare("INSERT INTO items (content) VALUES (?)"); + insertStmt.run("initial content"); + + const itemBefore = db.prepare("SELECT * FROM items").get(); + const originalUpdateAt = itemBefore.updated_at; + + // 少し待機(秒単位の精度なので更新がわかるように) + // NOTE: SQLiteのdatetime('now')は秒単位なので、同じ秒に更新されると変わらない可能性があるが、通常は問題ない + + const updateStmt = db.prepare("UPDATE items SET content = ? WHERE id = ?"); + updateStmt.run("updated content", itemBefore.id); + + const itemAfter = db.prepare("SELECT * FROM items").get(); + + expect(itemAfter.content).toBe("updated content"); + // 本来は時間が進むのを待つべきだが、トリガーが呼ばれていることの検証とする + expect(itemAfter.updated_at).toBeTruthy(); + + db.close(); + }); +}); diff --git a/tests/integration.test.js b/tests/integration.test.js new file mode 100644 index 0000000..8015290 --- /dev/null +++ b/tests/integration.test.js @@ -0,0 +1,152 @@ +import { afterEach, beforeEach, describe, expect, it } from "bun:test"; +import { cleanupTestDb, clearTestEnv, createTestDb, setTestEnv } from "./setup.js"; + +const TEST_DB = "test-vector-integration.db"; + +describe("Integration Tests", () => { + beforeEach(() => { + setTestEnv(); + cleanupTestDb(TEST_DB); + }); + + afterEach(() => { + cleanupTestDb(TEST_DB); + clearTestEnv(); + }); + + it("should complete full item lifecycle", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + ); + `); + + const content = "This is a test document"; + const path = "/documents/test.txt"; + + const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)"); + stmt.run(content, path); + + let items = db.prepare("SELECT * FROM items").all(); + expect(items.length).toBe(1); + expect(items[0].content).toBe(content); + expect(items[0].path).toBe(path); + const itemId = items[0].id; + + const results = db + .prepare(` + SELECT id, content, path, created_at, updated_at + FROM items + WHERE id = ? + `) + .all(itemId); + + expect(results.length).toBe(1); + expect(results[0].content).toBe(content); + expect(results[0].path).toBe(path); + expect(results[0].created_at).toBeTruthy(); + expect(results[0].updated_at).toBeTruthy(); + + db.close(); + }); + + it("should handle multiple items with different metadata", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + ); + DELETE FROM items; + `); + + const testData = [ + { content: "apple", path: "/fruits/apple.txt" }, + { content: "banana", path: "/fruits/banana.txt" }, + { content: "orange", path: "/fruits/orange.txt" }, + ]; + + const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)"); + testData.forEach((data) => { + stmt.run(data.content, data.path); + }); + + const allItems = db.prepare("SELECT * FROM items").all(); + expect(allItems.length).toBe(3); + + expect(allItems[0].path).toBe("/fruits/apple.txt"); + expect(allItems[1].path).toBe("/fruits/banana.txt"); + expect(allItems[2].path).toBe("/fruits/orange.txt"); + + db.close(); + }); + + it("should validate data integrity", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + ); + DELETE FROM items; + `); + + const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)"); + for (let i = 1; i <= 5; i++) { + stmt.run(`item ${i}`, `/path/${i}`); + } + + const items = db.prepare("SELECT COUNT(*) as cnt FROM items").all()[0]; + expect(items.cnt).toBe(5); + + const timestampedItems = db.prepare( + "SELECT id, content, created_at, updated_at FROM items" + ).all(); + + timestampedItems.forEach((item) => { + expect(item.created_at).toBeTruthy(); + expect(item.updated_at).toBeTruthy(); + }); + + db.close(); + }); + + it("should handle concurrent-like operations", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + ); + DELETE FROM items; + `); + + const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)"); + for (let i = 0; i < 10; i++) { + stmt.run(`content ${i}`, `/path/${i}`); + } + + const result = db.prepare("SELECT COUNT(*) as cnt FROM items").all()[0]; + expect(result.cnt).toBe(10); + + db.close(); + }); +}); diff --git a/tests/mcp-handlers.test.js b/tests/mcp-handlers.test.js new file mode 100644 index 0000000..c861b14 --- /dev/null +++ b/tests/mcp-handlers.test.js @@ -0,0 +1,166 @@ +import { afterEach, beforeEach, describe, expect, it } from "bun:test"; +import { cleanupTestDb, clearTestEnv, createTestDb, setTestEnv } from "./setup.js"; + +const TEST_DB = "test-vector.db"; + +describe("MCP Handlers Module", () => { + beforeEach(() => { + setTestEnv(); + cleanupTestDb(TEST_DB); + }); + + afterEach(() => { + cleanupTestDb(TEST_DB); + clearTestEnv(); + }); + + it("should validate embedding dimension correctly", () => { + const testVectors = [ + { dim: 384, valid: true }, + { dim: 2, valid: false }, + { dim: 385, valid: false }, + ]; + + const EMBEDDING_DIM = Number(process.env.VEC_DIM ?? 384); + + testVectors.forEach(({ dim, valid }) => { + const vector = new Array(dim).fill(0.5); + const isValid = vector.length === EMBEDDING_DIM; + expect(isValid).toBe(valid); + }); + }); + + it("should handle search results with all required fields", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + ); + `); + + const stmt = db.prepare(` + INSERT INTO items (content, path) VALUES (?, ?) + `); + stmt.run("test content", "/test/path"); + + const results = db + .prepare(` + SELECT content, path, created_at, updated_at + FROM items + WHERE id = ? + `) + .all(1); + + expect(results.length).toBe(1); + const result = results[0]; + expect(result.content).toBe("test content"); + expect(result.path).toBe("/test/path"); + expect(result.created_at).toBeTruthy(); + expect(result.updated_at).toBeTruthy(); + + db.close(); + }); + + it("should insert item and return id", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + ); + DELETE FROM items; + `); + + const stmt = db.prepare(` + INSERT INTO items (content, path) VALUES (?, ?) + `); + stmt.run("inserted content", "/inserted/path"); + + const items = db.prepare("SELECT * FROM items").all(); + expect(items.length).toBe(1); + expect(items[0].content).toBe("inserted content"); + expect(items[0].path).toBe("/inserted/path"); + + db.close(); + }); + + it("should perform similarity search", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + ); + DELETE FROM items; + `); + + const stmt = db.prepare("INSERT INTO items (content) VALUES (?)"); + stmt.run("item 1"); + stmt.run("item 2"); + stmt.run("item 3"); + + const items = db.prepare("SELECT * FROM items").all(); + expect(items.length).toBe(3); + + db.close(); + }); + + it("should handle empty results gracefully", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + ); + `); + + const results = db + .prepare("SELECT * FROM items WHERE content LIKE ?") + .all("%nonexistent%"); + + expect(results).toEqual([]); + + db.close(); + }); + + it("should preserve timestamps across operations", () => { + const db = createTestDb(TEST_DB); + + db.exec(` + CREATE TABLE if not exists items ( + id INTEGER PRIMARY KEY, + content TEXT, + path TEXT, + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + ); + `); + + const stmt = db.prepare("INSERT INTO items (content) VALUES (?)"); + stmt.run("test"); + + const items = db.prepare("SELECT created_at, updated_at FROM items").all(); + expect(items[0].created_at).toBeTruthy(); + expect(items[0].updated_at).toBeTruthy(); + expect(items[0].created_at).toMatch(/\d{4}-\d{2}-\d{2}/); + + db.close(); + }); +}); diff --git a/tests/scripts.test.js b/tests/scripts.test.js new file mode 100644 index 0000000..bab0e0d --- /dev/null +++ b/tests/scripts.test.js @@ -0,0 +1,58 @@ +import { describe, expect, test } from "bun:test"; +import { spawnSync } from "child_process"; +import fs from "fs"; +import path from "path"; + +const TMP_TEST_DIR = "test/tmp_scripts"; + +describe("Scripts Rust Support Test", () => { + // テスト用ディレクトリ作成 + if (!fs.existsSync(TMP_TEST_DIR)) { + fs.mkdirSync(TMP_TEST_DIR, { recursive: true }); + } + + test("analyze_nesting.js identifies deep nesting in Rust", () => { + const rustCode = ` + fn nested() { + if true { + if true { + if true { + match Some(1) { + Some(_) => { + println!("Deep!"); + } + None => {} + } + } + } + } + } + `; + const testFile = path.join(TMP_TEST_DIR, "test_deep.rs"); + fs.writeFileSync(testFile, rustCode); + + const result = spawnSync("node", ["scripts/analyze_nesting.js", testFile], { encoding: "utf-8" }); + expect(result.stdout).toContain("Level 5"); + expect(result.stdout).toContain("REFACTOR NEEDED"); + }); + + test("count_lines.js counts logical lines in Rust properly", () => { + const rustCode = ` + // Comment + fn main() { + /* Block + Comment */ + let x = 1; + + println!("{}", x); + } + `; + const testFile = path.join(TMP_TEST_DIR, "test_count.rs"); + fs.writeFileSync(testFile, rustCode); + + const result = spawnSync("node", ["scripts/count_lines.js", testFile], { encoding: "utf-8" }); + // fn main, let x, println, } = 4 logical lines (概算) + // 実際の実装にあわせたアサーション + expect(result.stdout).toContain("Logical : 4"); + }); +}); diff --git a/tests/setup.js b/tests/setup.js new file mode 100644 index 0000000..a723c8a --- /dev/null +++ b/tests/setup.js @@ -0,0 +1,45 @@ +import Database from "bun:sqlite"; +import * as fs from "fs"; + +// テスト用データベースのセットアップ +export function createTestDb(dbName = "test-vector.db") { + // 既存のテストDBを削除 + try { + if (fs.existsSync(dbName)) { + fs.unlinkSync(dbName); + } + } catch (err) { + // ロックされているファイルは無視して続行 + } + + const db = new Database(dbName); + return db; +} + +// テスト用データベースのクリーンアップ +export function cleanupTestDb(dbName = "test-vector.db") { + try { + if (fs.existsSync(dbName)) { + fs.unlinkSync(dbName); + } + } catch (err) { + // ファイルがロックされている場合も無視 + console.warn(`Failed to clean up ${dbName}: ${err.message}`); + } +} + +// テスト用環境変数の設定 +export function setTestEnv() { + process.env.VEC_DIM = "384"; + process.env.LLAMA_CPP_BASE_URL = "http://127.0.0.1:8080"; + process.env.LLAMA_CPP_EMBEDDING_MODEL = "nomic-embed-text"; + process.env.LLAMA_CPP_MODEL = "mistral"; +} + +// テスト用環境変数のクリア +export function clearTestEnv() { + delete process.env.VEC_DIM; + delete process.env.LLAMA_CPP_BASE_URL; + delete process.env.LLAMA_CPP_EMBEDDING_MODEL; + delete process.env.LLAMA_CPP_MODEL; +} diff --git a/tests/tmp_scripts/test_count.rs b/tests/tmp_scripts/test_count.rs new file mode 100644 index 0000000..7c183c7 --- /dev/null +++ b/tests/tmp_scripts/test_count.rs @@ -0,0 +1,10 @@ + + // Comment + fn main() { + /* Block + Comment */ + let x = 1; + + println!("{}", x); + } + \ No newline at end of file diff --git a/tests/tmp_scripts/test_deep.rs b/tests/tmp_scripts/test_deep.rs new file mode 100644 index 0000000..9875044 --- /dev/null +++ b/tests/tmp_scripts/test_deep.rs @@ -0,0 +1,16 @@ + + fn nested() { + if true { + if true { + if true { + match Some(1) { + Some(_) => { + println!("Deep!"); + } + None => {} + } + } + } + } + } + \ No newline at end of file diff --git a/tmp/sqlite-vector b/tmp/sqlite-vector new file mode 160000 index 0000000..f3b17cb --- /dev/null +++ b/tmp/sqlite-vector @@ -0,0 +1 @@ +Subproject commit f3b17cb214bc7b3cb0cd057eec0022bd27059c48 diff --git a/vector.pdb b/vector.pdb new file mode 100644 index 0000000..1f2504e --- /dev/null +++ b/vector.pdb Binary files differ diff --git a/vector_fat.dll b/vector_fat.dll new file mode 100644 index 0000000..8e3e144 --- /dev/null +++ b/vector_fat.dll Binary files differ diff --git a/vector_static.dll b/vector_static.dll new file mode 100644 index 0000000..8cf79c6 --- /dev/null +++ b/vector_static.dll Binary files differ