From f8740d27f7243d967d2bfd0bd5cd5d37f83a247a Mon Sep 17 00:00:00 2001 From: logan Date: Sat, 19 Sep 2026 22:43:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20OpsxDB=20=E6=A1=8C=E9=9D=A2=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=AE=A2=E6=88=B7=E7=AB=AF=E9=A6=96=E7=89=88?= =?UTF-8?q?=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 含工作台/连库多引擎字段与 SSH·SSL、结果编辑、Redis 键浏览、 Tauri 桌面与 docs/落地页;排除本地构建产物与 sidecar 二进制。 --- .gitignore | 33 + Makefile | 32 + README.md | 61 + api/openapi.yaml | 61 + apps/desktop/package-lock.json | 220 + apps/desktop/package.json | 11 + apps/desktop/src-tauri/Cargo.lock | 4811 +++++++++++++++++ apps/desktop/src-tauri/Cargo.toml | 21 + apps/desktop/src-tauri/binaries/README.md | 8 + apps/desktop/src-tauri/build.rs | 3 + .../src-tauri/capabilities/default.json | 11 + apps/desktop/src-tauri/icons/128x128.png | Bin 0 -> 7379 bytes apps/desktop/src-tauri/icons/128x128@2x.png | Bin 0 -> 15450 bytes apps/desktop/src-tauri/icons/32x32.png | Bin 0 -> 1545 bytes apps/desktop/src-tauri/icons/64x64.png | Bin 0 -> 3465 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 6185 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 8280 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 8674 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 17920 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 0 -> 1418 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 19994 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 0 -> 2189 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 0 -> 3839 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 0 -> 4985 bytes apps/desktop/src-tauri/icons/StoreLogo.png | Bin 0 -> 2539 bytes .../android/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2323 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 9515 bytes .../android/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 2167 bytes .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2237 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 6208 bytes .../android/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2066 bytes .../android/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5158 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 12908 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 4817 bytes .../android/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 8300 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 21061 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 7602 bytes .../android/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11334 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 31713 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 9991 bytes .../android/values/ic_launcher_background.xml | 4 + apps/desktop/src-tauri/icons/icon.icns | Bin 0 -> 237999 bytes apps/desktop/src-tauri/icons/icon.ico | Bin 0 -> 25964 bytes apps/desktop/src-tauri/icons/icon.png | Bin 0 -> 37850 bytes apps/desktop/src-tauri/icons/icon.svg | 7 + .../src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 0 -> 898 bytes .../icons/ios/AppIcon-20x20@2x-1.png | Bin 0 -> 1970 bytes .../src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 0 -> 1970 bytes .../src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 0 -> 3153 bytes .../src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 0 -> 1355 bytes .../icons/ios/AppIcon-29x29@2x-1.png | Bin 0 -> 3072 bytes .../src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 0 -> 3072 bytes .../src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 0 -> 4864 bytes .../src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 0 -> 1970 bytes .../icons/ios/AppIcon-40x40@2x-1.png | Bin 0 -> 4459 bytes .../src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 0 -> 4459 bytes .../src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 0 -> 6981 bytes .../src-tauri/icons/ios/AppIcon-512@2x.png | Bin 0 -> 115197 bytes .../src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 0 -> 6981 bytes .../src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 0 -> 10551 bytes .../src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 0 -> 4175 bytes .../src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 0 -> 8940 bytes .../icons/ios/AppIcon-83.5x83.5@2x.png | Bin 0 -> 9654 bytes apps/desktop/src-tauri/src/lib.rs | 150 + apps/desktop/src-tauri/src/main.rs | 3 + apps/desktop/src-tauri/src/sidecar.rs | 108 + apps/desktop/src-tauri/tauri.conf.json | 43 + apps/server/cmd/opsxdb/main.go | 30 + apps/server/config.example.yaml | 7 + apps/server/go.mod | 63 + apps/server/go.sum | 185 + apps/server/internal/ai/stub.go | 97 + apps/server/internal/db/danger.go | 50 + apps/server/internal/db/ident.go | 19 + apps/server/internal/db/mssql.go | 139 + apps/server/internal/db/mysql.go | 152 + apps/server/internal/db/open.go | 85 + apps/server/internal/db/ops.go | 238 + apps/server/internal/db/ops_test.go | 39 + apps/server/internal/db/oracle.go | 145 + apps/server/internal/db/postgres.go | 147 + apps/server/internal/db/redis.go | 597 ++ apps/server/internal/db/redis_keys_test.go | 86 + apps/server/internal/db/redis_ttl_test.go | 29 + apps/server/internal/db/session.go | 180 + apps/server/internal/db/sqlite.go | 70 + apps/server/internal/db/ssh_tunnel.go | 216 + apps/server/internal/db/tls.go | 115 + apps/server/internal/db/tls_test.go | 111 + apps/server/internal/db/types.go | 98 + apps/server/internal/docs/assets/docs.css | 39 + .../server/internal/docs/content/connect.html | 7 + apps/server/internal/docs/content/faq.html | 7 + .../server/internal/docs/content/install.html | 13 + .../internal/docs/content/workbench.html | 7 + apps/server/internal/docs/docs.go | 89 + apps/server/internal/docs/template.html | 19 + apps/server/internal/proxy/guard.go | 36 + apps/server/internal/proxy/guard_test.go | 23 + apps/server/internal/proxy/handler.go | 111 + apps/server/internal/proxy/types.go | 23 + apps/server/internal/server/router.go | 229 + apps/server/internal/site/assets/site.css | 50 + apps/server/internal/site/site.go | 58 + apps/server/internal/site/template.html | 36 + apps/web/index.html | 14 + apps/web/package.json | 30 + apps/web/postcss.config.js | 6 + apps/web/public/favicon.svg | 7 + apps/web/public/icons/databases/dameng.svg | 1 + .../public/icons/databases/elasticsearch.svg | 1 + apps/web/public/icons/databases/gaussdb.svg | 1 + apps/web/public/icons/databases/influxdb.svg | 1 + apps/web/public/icons/databases/kingbase.svg | 1 + apps/web/public/icons/databases/mariadb.svg | 1 + apps/web/public/icons/databases/mongodb.svg | 1 + apps/web/public/icons/databases/mysql.svg | 1 + apps/web/public/icons/databases/oceanbase.svg | 1 + apps/web/public/icons/databases/opengauss.svg | 1 + apps/web/public/icons/databases/oracle.svg | 1 + apps/web/public/icons/databases/polardb.png | Bin 0 -> 3908 bytes .../web/public/icons/databases/postgresql.svg | 1 + apps/web/public/icons/databases/redis.svg | 1 + apps/web/public/icons/databases/sqlite.svg | 7 + apps/web/public/icons/databases/sqlserver.svg | 1 + apps/web/public/icons/databases/tdsql.svg | 15 + apps/web/public/icons/databases/tidb.svg | 1 + apps/web/public/icons/databases/zookeeper.svg | 1 + apps/web/public/icons/icon-512.png | Bin 0 -> 59414 bytes apps/web/src/main.tsx | 10 + apps/web/src/styles.css | 427 ++ apps/web/src/styles.css.bak | 48 + apps/web/tailwind.config.ts | 15 + apps/web/tsconfig.app.json | 17 + apps/web/tsconfig.json | 11 + apps/web/tsconfig.node.json | 14 + apps/web/vite.config.ts | 29 + connection-types/dameng.yaml | 39 + connection-types/mongodb.yaml | 37 + connection-types/mysql.yaml | 32 + connection-types/oracle.yaml | 48 + connection-types/postgres.yaml | 36 + connection-types/redis.yaml | 29 + connection-types/sqlserver.yaml | 41 + package-lock.json | 3355 ++++++++++++ package.json | 18 + packages/core/package.json | 19 + packages/core/src/index.ts | 10 + packages/core/src/replaceVariables.test.ts | 29 + packages/core/src/replaceVariables.ts | 35 + packages/core/src/types.ts | 39 + packages/core/tsconfig.json | 10 + packages/core/vitest.config.ts | 7 + packages/transport/package.json | 25 + packages/transport/src/browser.ts | 81 + packages/transport/src/detect.ts | 41 + packages/transport/src/ginProxy.ts | 35 + packages/transport/src/index.ts | 5 + packages/transport/src/tauriNative.ts | 68 + packages/transport/tsconfig.json | 10 + packages/ui/package.json | 32 + packages/ui/src/AiPanel.tsx | 185 + packages/ui/src/ConnectionForm.tsx | 561 ++ packages/ui/src/ConnectionList.tsx | 249 + packages/ui/src/ConnectionPicker.tsx | 324 ++ packages/ui/src/ConnectionSidebar.tsx | 233 + packages/ui/src/DriverIcon.tsx | 36 + packages/ui/src/NotifyHost.tsx | 216 + packages/ui/src/ObjectTree.tsx | 848 +++ packages/ui/src/ResultPane.tsx | 664 +++ packages/ui/src/SchemaPane.tsx | 92 + packages/ui/src/SqlEditor.tsx | 122 + packages/ui/src/Workspace.tsx | 931 ++++ packages/ui/src/api.ts | 238 + packages/ui/src/catalog.ts | 72 + packages/ui/src/dsn.ts | 57 + packages/ui/src/index.ts | 12 + packages/ui/src/notify.ts | 86 + packages/ui/src/secrets.ts | 25 + packages/ui/src/sql.ts | 374 ++ packages/ui/src/store.ts | 786 +++ packages/ui/tsconfig.json | 10 + run.sh | 308 ++ tests/README.md | 164 + tests/dbctl.sh | 200 + tests/docker-compose.yml | 189 + tests/edit-tree.png | Bin 0 -> 100481 bytes tests/edit-tree2.png | Bin 0 -> 92456 bytes tests/init/mariadb/01_demo.sql | 53 + tests/init/mssql/01_demo.sql | 40 + tests/init/mysql/01_demo.sql | 53 + tests/init/oracle/01_demo.sql | 43 + tests/init/postgres/01_demo.sql | 32 + tests/init/sqlite/01_demo.sql | 31 + tests/test-db.sh | 6 + tests/tmp/demo.sqlite | Bin 0 -> 20480 bytes tests/ui-reg-cancel/01-form.png | Bin 0 -> 30648 bytes tests/ui-reg-cancel/02-before-run.png | Bin 0 -> 57312 bytes tests/ui-reg-cancel/03-running.png | Bin 0 -> 56856 bytes tests/ui-reg-cancel/04-cancelled.png | Bin 0 -> 52974 bytes tests/ui-reg-cancel/result.json | 17 + tests/ui-reg-conn/01-home.png | Bin 0 -> 49905 bytes tests/ui-reg-conn/02-picker.png | Bin 0 -> 56596 bytes tests/ui-reg-conn/03-redis-general.png | Bin 0 -> 34663 bytes tests/ui-reg-conn/04-advanced.png | Bin 0 -> 33507 bytes tests/ui-reg-conn/05-ssh.png | Bin 0 -> 37684 bytes tests/ui-reg-conn/06-test.png | Bin 0 -> 58609 bytes tests/ui-reg-conn/error.png | Bin 0 -> 58609 bytes tests/ui-reg-conn/open-MySQL.png | Bin 0 -> 30104 bytes tests/ui-reg-conn/open-Oracle.png | Bin 0 -> 38261 bytes tests/ui-reg-conn/open-PostgreSQL.png | Bin 0 -> 35181 bytes tests/ui-reg-conn/open-Redis.png | Bin 0 -> 34578 bytes tests/ui-reg-conn/open-SQL_Server.png | Bin 0 -> 37142 bytes tests/ui-reg-conn/result-engines.json | 25 + tests/ui-reg-conn/result.json | 40 + tests/ui-reg-conn/result2.json | 20 + tests/ui-reg-redis-keys/01-ws.png | Bin 0 -> 71333 bytes tests/ui-reg-redis-keys/02-expand.png | Bin 0 -> 71875 bytes tests/ui-reg-redis-keys/05-keys-exp.png | Bin 0 -> 90030 bytes tests/ui-reg-redis-keys/err2.png | Bin 0 -> 91617 bytes tests/ui-reg-redis-keys/error.png | Bin 0 -> 68913 bytes tests/ui-reg-redis-keys/result.json | 20 + tests/ui-reg-ssl/01-mysql-ssl.png | Bin 0 -> 25876 bytes tests/ui-reg-ssl/02-sqlite.png | Bin 0 -> 23593 bytes tests/ui-reg-ssl/03-ssl-on-fail.png | Bin 0 -> 41677 bytes tests/ui-reg-ssl/04-ssl-off-ok.png | Bin 0 -> 32232 bytes tests/ui-reg-ssl/04-ssl-off.png | Bin 0 -> 27782 bytes tests/ui-reg-ssl/05-require-fail.png | Bin 0 -> 67769 bytes tests/ui-reg-ssl/06-skip-ok.png | Bin 0 -> 45999 bytes tests/ui-reg-ssl/error.png | Bin 0 -> 30214 bytes tests/ui-reg-ssl/result-final.json | 20 + tests/ui-reg-ssl/result.json | 41 + tests/ui-reg-ux/01-backend-down.png | Bin 0 -> 67809 bytes tests/ui-reg-ux/02-after-retry.png | Bin 0 -> 62385 bytes tests/ui-reg-ux/03-list.png | Bin 0 -> 28160 bytes tests/ui-reg-ux/04-editor.png | Bin 0 -> 69239 bytes tests/ui-reg-ux/result.json | 22 + tests/verify-crud.sh | 173 + tsconfig.base.json | 23 + 240 files changed, 21625 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 api/openapi.yaml create mode 100644 apps/desktop/package-lock.json create mode 100644 apps/desktop/package.json create mode 100644 apps/desktop/src-tauri/Cargo.lock create mode 100644 apps/desktop/src-tauri/Cargo.toml create mode 100644 apps/desktop/src-tauri/binaries/README.md create mode 100644 apps/desktop/src-tauri/build.rs create mode 100644 apps/desktop/src-tauri/capabilities/default.json create mode 100644 apps/desktop/src-tauri/icons/128x128.png create mode 100644 apps/desktop/src-tauri/icons/128x128@2x.png create mode 100644 apps/desktop/src-tauri/icons/32x32.png create mode 100644 apps/desktop/src-tauri/icons/64x64.png create mode 100644 apps/desktop/src-tauri/icons/Square107x107Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square142x142Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square150x150Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square284x284Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square30x30Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square310x310Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square44x44Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square71x71Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square89x89Logo.png create mode 100644 apps/desktop/src-tauri/icons/StoreLogo.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml create mode 100644 apps/desktop/src-tauri/icons/icon.icns create mode 100644 apps/desktop/src-tauri/icons/icon.ico create mode 100644 apps/desktop/src-tauri/icons/icon.png create mode 100644 apps/desktop/src-tauri/icons/icon.svg create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x-1.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-20x20@3x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x-1.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-29x29@3x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-40x40@1x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x-1.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-512@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png create mode 100644 apps/desktop/src-tauri/src/lib.rs create mode 100644 apps/desktop/src-tauri/src/main.rs create mode 100644 apps/desktop/src-tauri/src/sidecar.rs create mode 100644 apps/desktop/src-tauri/tauri.conf.json create mode 100644 apps/server/cmd/opsxdb/main.go create mode 100644 apps/server/config.example.yaml create mode 100644 apps/server/go.mod create mode 100644 apps/server/go.sum create mode 100644 apps/server/internal/ai/stub.go create mode 100644 apps/server/internal/db/danger.go create mode 100644 apps/server/internal/db/ident.go create mode 100644 apps/server/internal/db/mssql.go create mode 100644 apps/server/internal/db/mysql.go create mode 100644 apps/server/internal/db/open.go create mode 100644 apps/server/internal/db/ops.go create mode 100644 apps/server/internal/db/ops_test.go create mode 100644 apps/server/internal/db/oracle.go create mode 100644 apps/server/internal/db/postgres.go create mode 100644 apps/server/internal/db/redis.go create mode 100644 apps/server/internal/db/redis_keys_test.go create mode 100644 apps/server/internal/db/redis_ttl_test.go create mode 100644 apps/server/internal/db/session.go create mode 100644 apps/server/internal/db/sqlite.go create mode 100644 apps/server/internal/db/ssh_tunnel.go create mode 100644 apps/server/internal/db/tls.go create mode 100644 apps/server/internal/db/tls_test.go create mode 100644 apps/server/internal/db/types.go create mode 100644 apps/server/internal/docs/assets/docs.css create mode 100644 apps/server/internal/docs/content/connect.html create mode 100644 apps/server/internal/docs/content/faq.html create mode 100644 apps/server/internal/docs/content/install.html create mode 100644 apps/server/internal/docs/content/workbench.html create mode 100644 apps/server/internal/docs/docs.go create mode 100644 apps/server/internal/docs/template.html create mode 100644 apps/server/internal/proxy/guard.go create mode 100644 apps/server/internal/proxy/guard_test.go create mode 100644 apps/server/internal/proxy/handler.go create mode 100644 apps/server/internal/proxy/types.go create mode 100644 apps/server/internal/server/router.go create mode 100644 apps/server/internal/site/assets/site.css create mode 100644 apps/server/internal/site/site.go create mode 100644 apps/server/internal/site/template.html create mode 100644 apps/web/index.html create mode 100644 apps/web/package.json create mode 100644 apps/web/postcss.config.js create mode 100644 apps/web/public/favicon.svg create mode 100644 apps/web/public/icons/databases/dameng.svg create mode 100644 apps/web/public/icons/databases/elasticsearch.svg create mode 100644 apps/web/public/icons/databases/gaussdb.svg create mode 100644 apps/web/public/icons/databases/influxdb.svg create mode 100644 apps/web/public/icons/databases/kingbase.svg create mode 100644 apps/web/public/icons/databases/mariadb.svg create mode 100644 apps/web/public/icons/databases/mongodb.svg create mode 100644 apps/web/public/icons/databases/mysql.svg create mode 100644 apps/web/public/icons/databases/oceanbase.svg create mode 100644 apps/web/public/icons/databases/opengauss.svg create mode 100644 apps/web/public/icons/databases/oracle.svg create mode 100644 apps/web/public/icons/databases/polardb.png create mode 100644 apps/web/public/icons/databases/postgresql.svg create mode 100644 apps/web/public/icons/databases/redis.svg create mode 100644 apps/web/public/icons/databases/sqlite.svg create mode 100644 apps/web/public/icons/databases/sqlserver.svg create mode 100644 apps/web/public/icons/databases/tdsql.svg create mode 100644 apps/web/public/icons/databases/tidb.svg create mode 100644 apps/web/public/icons/databases/zookeeper.svg create mode 100644 apps/web/public/icons/icon-512.png create mode 100644 apps/web/src/main.tsx create mode 100644 apps/web/src/styles.css create mode 100644 apps/web/src/styles.css.bak create mode 100644 apps/web/tailwind.config.ts create mode 100644 apps/web/tsconfig.app.json create mode 100644 apps/web/tsconfig.json create mode 100644 apps/web/tsconfig.node.json create mode 100644 apps/web/vite.config.ts create mode 100644 connection-types/dameng.yaml create mode 100644 connection-types/mongodb.yaml create mode 100644 connection-types/mysql.yaml create mode 100644 connection-types/oracle.yaml create mode 100644 connection-types/postgres.yaml create mode 100644 connection-types/redis.yaml create mode 100644 connection-types/sqlserver.yaml create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 packages/core/package.json create mode 100644 packages/core/src/index.ts create mode 100644 packages/core/src/replaceVariables.test.ts create mode 100644 packages/core/src/replaceVariables.ts create mode 100644 packages/core/src/types.ts create mode 100644 packages/core/tsconfig.json create mode 100644 packages/core/vitest.config.ts create mode 100644 packages/transport/package.json create mode 100644 packages/transport/src/browser.ts create mode 100644 packages/transport/src/detect.ts create mode 100644 packages/transport/src/ginProxy.ts create mode 100644 packages/transport/src/index.ts create mode 100644 packages/transport/src/tauriNative.ts create mode 100644 packages/transport/tsconfig.json create mode 100644 packages/ui/package.json create mode 100644 packages/ui/src/AiPanel.tsx create mode 100644 packages/ui/src/ConnectionForm.tsx create mode 100644 packages/ui/src/ConnectionList.tsx create mode 100644 packages/ui/src/ConnectionPicker.tsx create mode 100644 packages/ui/src/ConnectionSidebar.tsx create mode 100644 packages/ui/src/DriverIcon.tsx create mode 100644 packages/ui/src/NotifyHost.tsx create mode 100644 packages/ui/src/ObjectTree.tsx create mode 100644 packages/ui/src/ResultPane.tsx create mode 100644 packages/ui/src/SchemaPane.tsx create mode 100644 packages/ui/src/SqlEditor.tsx create mode 100644 packages/ui/src/Workspace.tsx create mode 100644 packages/ui/src/api.ts create mode 100644 packages/ui/src/catalog.ts create mode 100644 packages/ui/src/dsn.ts create mode 100644 packages/ui/src/index.ts create mode 100644 packages/ui/src/notify.ts create mode 100644 packages/ui/src/secrets.ts create mode 100644 packages/ui/src/sql.ts create mode 100644 packages/ui/src/store.ts create mode 100644 packages/ui/tsconfig.json create mode 100755 run.sh create mode 100644 tests/README.md create mode 100755 tests/dbctl.sh create mode 100644 tests/docker-compose.yml create mode 100644 tests/edit-tree.png create mode 100644 tests/edit-tree2.png create mode 100644 tests/init/mariadb/01_demo.sql create mode 100644 tests/init/mssql/01_demo.sql create mode 100644 tests/init/mysql/01_demo.sql create mode 100644 tests/init/oracle/01_demo.sql create mode 100644 tests/init/postgres/01_demo.sql create mode 100644 tests/init/sqlite/01_demo.sql create mode 100755 tests/test-db.sh create mode 100644 tests/tmp/demo.sqlite create mode 100644 tests/ui-reg-cancel/01-form.png create mode 100644 tests/ui-reg-cancel/02-before-run.png create mode 100644 tests/ui-reg-cancel/03-running.png create mode 100644 tests/ui-reg-cancel/04-cancelled.png create mode 100644 tests/ui-reg-cancel/result.json create mode 100644 tests/ui-reg-conn/01-home.png create mode 100644 tests/ui-reg-conn/02-picker.png create mode 100644 tests/ui-reg-conn/03-redis-general.png create mode 100644 tests/ui-reg-conn/04-advanced.png create mode 100644 tests/ui-reg-conn/05-ssh.png create mode 100644 tests/ui-reg-conn/06-test.png create mode 100644 tests/ui-reg-conn/error.png create mode 100644 tests/ui-reg-conn/open-MySQL.png create mode 100644 tests/ui-reg-conn/open-Oracle.png create mode 100644 tests/ui-reg-conn/open-PostgreSQL.png create mode 100644 tests/ui-reg-conn/open-Redis.png create mode 100644 tests/ui-reg-conn/open-SQL_Server.png create mode 100644 tests/ui-reg-conn/result-engines.json create mode 100644 tests/ui-reg-conn/result.json create mode 100644 tests/ui-reg-conn/result2.json create mode 100644 tests/ui-reg-redis-keys/01-ws.png create mode 100644 tests/ui-reg-redis-keys/02-expand.png create mode 100644 tests/ui-reg-redis-keys/05-keys-exp.png create mode 100644 tests/ui-reg-redis-keys/err2.png create mode 100644 tests/ui-reg-redis-keys/error.png create mode 100644 tests/ui-reg-redis-keys/result.json create mode 100644 tests/ui-reg-ssl/01-mysql-ssl.png create mode 100644 tests/ui-reg-ssl/02-sqlite.png create mode 100644 tests/ui-reg-ssl/03-ssl-on-fail.png create mode 100644 tests/ui-reg-ssl/04-ssl-off-ok.png create mode 100644 tests/ui-reg-ssl/04-ssl-off.png create mode 100644 tests/ui-reg-ssl/05-require-fail.png create mode 100644 tests/ui-reg-ssl/06-skip-ok.png create mode 100644 tests/ui-reg-ssl/error.png create mode 100644 tests/ui-reg-ssl/result-final.json create mode 100644 tests/ui-reg-ssl/result.json create mode 100644 tests/ui-reg-ux/01-backend-down.png create mode 100644 tests/ui-reg-ux/02-after-retry.png create mode 100644 tests/ui-reg-ux/03-list.png create mode 100644 tests/ui-reg-ux/04-editor.png create mode 100644 tests/ui-reg-ux/result.json create mode 100755 tests/verify-crud.sh create mode 100644 tsconfig.base.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b6f11fe --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +node_modules/ +dist/ +build/ +target/ +.DS_Store +*.log +.env +.env.* +!.env.example +release/ +*.local +.vite/ +coverage/ +.turbo/ +.idea/ +.vscode/ +apps/server/opsxapi +apps/server/server +apps/desktop/src-tauri/gen/ +*.exe +*.dylib +*.so +Cargo.lock +!apps/desktop/src-tauri/Cargo.lock + +# local review / sync artifacts +.ui-review-*/ +_refs/ +_sync/ +opsxdb-refs.tar.gz +apps/server/bin/ +logs/ +apps/desktop/src-tauri/binaries/opsxdb-server-* diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4679e29 --- /dev/null +++ b/Makefile @@ -0,0 +1,32 @@ +.PHONY: install web gui all server stop status build-web test desktop + +install: + npm install + npm --prefix apps/desktop install + +web: + ./run.sh web + +gui: + ./run.sh gui + +all: + ./run.sh all + +server: + ./run.sh server + +stop: + ./run.sh stop + +status: + ./run.sh status + +desktop: + ./run.sh desktop + +build-web: + npm run build:web + +test: + npm run test:core diff --git a/README.md b/README.md new file mode 100644 index 0000000..1e87108 --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +> **产品形态:桌面 GUI(Tauri)**。`http://127.0.0.1:5174` 仅为开发壳。文档 `/docs`、官网 `/` 由本机后端提供。 + +# OpsxDB + +给运维和开发用的 **数据库客户端**(连接管理 / SQL 工作台 / AI 写 SQL)。 + +从 OpsxAPI 脚手架分叉:同一套 monorepo(web + Gin + 可选 Tauri),产品面换成 DB。 + +## 架构 + +``` +packages/ui 连接选择器 + SQL 工作台 + AI 面板 +packages/core 共享工具(保留) +packages/transport 浏览器 / Gin / Tauri(保留兼容) +apps/web Vite + React(:5174) +apps/desktop Tauri 2 壳 +apps/server Gin:health + MySQL 驱动 + AI stub(:8788) +``` + +## 怎么跑 + +```bash +export PATH="$HOME/.nvm/versions/node/v24.19.0/bin:/opt/homebrew/bin:$PATH" +export OPSXDB_SERVER_PORT=8788 OPSXDB_WEB_PORT=5174 + +npm install +./run.sh web # Gin :8788 + Vite :5174 +``` + +打开 http://127.0.0.1:5174/ + +```bash +curl -s http://127.0.0.1:8788/api/health +curl -s -X POST http://127.0.0.1:8788/api/ai/chat \ + -H 'Content-Type: application/json' \ + -d '{"action":"generate","prompt":"查最近用户"}' +``` + +## 日常怎么用 + +1. **新建连接** → 选类型,或粘贴 `mysql://user:pass@host:3306/db` 点「填入」 +2. **测试** → **保存并连接** +3. 左侧点库展开表;**点表名**打开前 100 行(展开表看列) +4. 编辑器 **⌘/Ctrl+Enter** 执行当前语句或选区(不是整页脚本) +5. 结果:**复制 / CSV / INSERT**;双击单元格复制 + +## 已做(便捷向) + +- 连接选择器:搜索 / 分类 / 最近 / 图标网格;URL 拆字段;按驱动表单(SQLite 文件、Redis、Oracle Service、SSL) +- 工作台:懒加载对象树、点表看数据、CodeMirror SQL、多 Tab、可拖分栏 +- 会话:连接后查询只带 `sessionId`,账密不再每次上送;本机密码做了混淆 +- 结果截断提示、危险 SQL 确认、查询历史、主题/Tab 持久化、快捷键 +- 驱动:MySQL 族 / PostgreSQL 族(含 GaussDB、人大金仓)/ SQL Server / Oracle / SQLite / Redis +- AI 面板仍是 stub(生成/解释/优化/修复/方言/样例) + +## 端口 + +| 服务 | 端口 | 环境变量 | +|------|------|----------| +| Gin | 8788 | `OPSXDB_SERVER_PORT` / `OPSXDB_ADDR` | +| Vite | 5174 | `OPSXDB_WEB_PORT` | diff --git a/api/openapi.yaml b/api/openapi.yaml new file mode 100644 index 0000000..1f898ba --- /dev/null +++ b/api/openapi.yaml @@ -0,0 +1,61 @@ +openapi: 3.0.3 +info: + title: OpsxDB Server + version: 0.2.0 + description: Database workbench API — sessions, metadata, SQL exec +servers: + - url: http://127.0.0.1:8788 +paths: + /health: + get: + summary: Health check + responses: + "200": + description: OK + /api/health: + get: + summary: Health check + responses: + "200": + description: OK + /api/db/test-connection: + post: + summary: Ping a database without creating a session + /api/db/open: + post: + summary: Ping and create a server-side session (password stays on server) + /api/db/close: + post: + summary: Close a session + /api/db/databases: + post: + summary: List databases (sessionId or full conn) + /api/db/tables: + post: + summary: List tables in a database + /api/db/columns: + post: + summary: List columns of a table + /api/db/exec: + post: + summary: Execute SQL or Redis command + /api/ai/chat: + post: + summary: AI actions (currently stub) +components: + schemas: + ConnReq: + type: object + properties: + driver: { type: string } + host: { type: string } + port: { type: integer } + user: { type: string } + password: { type: string } + database: { type: string } + service: { type: string } + ssl: { type: boolean } + sessionId: { type: string } + sql: { type: string } + table: { type: string } + limit: { type: integer } diff --git a/apps/desktop/package-lock.json b/apps/desktop/package-lock.json new file mode 100644 index 0000000..5031bd6 --- /dev/null +++ b/apps/desktop/package-lock.json @@ -0,0 +1,220 @@ +{ + "name": "@opsxdb/desktop", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@opsxdb/desktop", + "version": "0.1.0", + "devDependencies": { + "@tauri-apps/cli": "^2.4.0" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.11.4.tgz", + "integrity": "sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==", + "dev": true, + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.11.4", + "@tauri-apps/cli-darwin-x64": "2.11.4", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.11.4", + "@tauri-apps/cli-linux-arm64-gnu": "2.11.4", + "@tauri-apps/cli-linux-arm64-musl": "2.11.4", + "@tauri-apps/cli-linux-riscv64-gnu": "2.11.4", + "@tauri-apps/cli-linux-x64-gnu": "2.11.4", + "@tauri-apps/cli-linux-x64-musl": "2.11.4", + "@tauri-apps/cli-win32-arm64-msvc": "2.11.4", + "@tauri-apps/cli-win32-ia32-msvc": "2.11.4", + "@tauri-apps/cli-win32-x64-msvc": "2.11.4" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.11.4.tgz", + "integrity": "sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.11.4.tgz", + "integrity": "sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.11.4.tgz", + "integrity": "sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.11.4.tgz", + "integrity": "sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.11.4.tgz", + "integrity": "sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.11.4.tgz", + "integrity": "sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.11.4.tgz", + "integrity": "sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.11.4.tgz", + "integrity": "sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.11.4.tgz", + "integrity": "sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.11.4.tgz", + "integrity": "sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.11.4.tgz", + "integrity": "sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + } + } +} diff --git a/apps/desktop/package.json b/apps/desktop/package.json new file mode 100644 index 0000000..8a6d833 --- /dev/null +++ b/apps/desktop/package.json @@ -0,0 +1,11 @@ +{ + "name": "@opsxdb/desktop", + "version": "0.1.0", + "private": true, + "scripts": { + "tauri": "tauri" + }, + "devDependencies": { + "@tauri-apps/cli": "^2.4.0" + } +} diff --git a/apps/desktop/src-tauri/Cargo.lock b/apps/desktop/src-tauri/Cargo.lock new file mode 100644 index 0000000..3b5714f --- /dev/null +++ b/apps/desktop/src-tauri/Cargo.lock @@ -0,0 +1,4811 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.13.2", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbad30e4b4c14a39e3cc8aed085a12a327257c316619c93581e017bc52be591" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.20", +] + +[[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.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3eb0f42d6c360dc3f8a821f6bf2fdea7f72bfd36b3076eb0e6d1e9e0752fff4" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "rand_core", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "cookie" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.13.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[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.119", +] + +[[package]] +name = "ctor" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[package]] +name = "darling" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.5", +] + +[[package]] +name = "darling_macro" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" +dependencies = [ + "darling_core", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "dbus" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.20", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "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 = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.2", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser", + "foldhash", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dtor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.6+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 = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core", + "wasm-bindgen", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.13.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[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", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 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 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jiff" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1baf72f08796de0260609515130699b890ac25f30e610ad894bc5856cafdb" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link 0.2.1", +] + +[[package]] +name = "jiff-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e52fe76043ccecc9005d2305ebaadf7d7fc0cc89ca6baa10a94d6bc68c7128c" +dependencies = [ + "defmt", + "log", +] + +[[package]] +name = "jiff-static" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "378268a1116ad67ae6228701118ac9f491d78fda38a40a1f1a9e1348de6f7212" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "js-sys" +version = "0.3.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" +dependencies = [ + "cfg-if", + "futures-util", + "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.13.2", + "serde", + "unicode-segmentation", +] + +[[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.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6480ccc157a1389bb2e4891b24751b0f798ba640d22386f23143fbcc89da195a" +dependencies = [ + "libc", +] + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + +[[package]] +name = "lru-slab" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f" + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.20", + "windows-sys 0.61.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.2", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.2", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.2", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "opsxdb-desktop" +version = "0.1.0" +dependencies = [ + "reqwest 0.12.28", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tokio", + "url", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plist" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896bade328c13f7042a297ea5ac5b0951f6cf989dea5f32c2fd98da398195cb" +dependencies = [ + "base64 0.23.1", + "indexmap 2.14.2", + "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 0.8.9", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.15+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4051e23e9185c255a7e33ef59cdbca87a22d359052eecd22fc6b901fb37d9d11" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.20", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9746dbde176634f4f2f1faf2404e30a31b2bc1e9cafb5329c95d8177a18c9fc" +dependencies = [ + "bytes", + "getrandom 0.4.3", + "lru-slab", + "rand", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.20", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "redox_users" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" +dependencies = [ + "libredox", + "thiserror 2.0.20", +] + +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "reqwest" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16a1cfa75cc186dd73d5818e510e042e40927bccc9c236b061cea97e1eb08029" +dependencies = [ + "base64 0.23.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "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 = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustls" +version = "0.23.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.119", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.13.2", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +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.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "935177bb8c0cd8ca1a4e6d1a2ac8988bea69cab4f9d3a31311e012ad27868ea4" +dependencies = [ + "base64 0.23.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.2", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d607aa01a3cb0ad757d6fd216136910db3c97b102fe686585689615a02dbcdc" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "swift-rs" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e45c444e496845d3f2a351146bff59aae4975b2280238df1dfaa0c7d1846f38e" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[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.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" +dependencies = [ + "bitflags 2.13.2", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "once_cell", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5" +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.5", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.20", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.119", + "tauri-utils", + "thiserror 2.0.20", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.20", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "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.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.20", + "toml 1.1.6+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.6+spec-1.1.0", +] + +[[package]] +name = "tendril" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" +dependencies = [ + "new_debug_unreachable", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl 2.0.20", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +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.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.2", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" +dependencies = [ + "indexmap 2.14.2", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "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_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.2", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.2", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.15+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1340ea94a5856333492c9064b02c778b191dd2c853778d9609debdcdfea3a614" +dependencies = [ + "indexmap 2.14.2", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.2", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045979e3f037cd18ad1cb2a419dfda133c5c29c9f3453370079f2255d46c257e" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.20", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "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-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[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 = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.5", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8b815c1b593dc0baf78dd0f4fc8fdb2de53198fb1163738093e9a311c33fb3" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webpki-roots" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +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.119", +] + +[[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.20", + "windows", + "windows-core 0.61.2", +] + +[[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.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.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-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.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.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.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", + "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-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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[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_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.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.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "wry" +version = "0.55.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.20", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "zlib-rs" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml new file mode 100644 index 0000000..d54d112 --- /dev/null +++ b/apps/desktop/src-tauri/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "opsxdb-desktop" +version = "0.1.0" +description = "OpsxDB Tauri desktop shell" +authors = ["OpsxDB"] +edition = "2021" + +[lib] +name = "opsxdb_desktop_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } # path via Manager +serde = { version = "1", features = ["derive"] } +serde_json = "1" +reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "json", "blocking"] } +tokio = { version = "1", features = ["time"] } +url = "2" diff --git a/apps/desktop/src-tauri/binaries/README.md b/apps/desktop/src-tauri/binaries/README.md new file mode 100644 index 0000000..bc991c0 --- /dev/null +++ b/apps/desktop/src-tauri/binaries/README.md @@ -0,0 +1,8 @@ +# Sidecar binaries + +`./run.sh package` 会把 `opsxdb-server` 复制为带目标三元组后缀的文件,例如: + +- `opsxdb-server-aarch64-apple-darwin` +- `opsxdb-server-x86_64-apple-darwin` + +Tauri `externalBin` 在构建时按当前 triple 解析。 diff --git a/apps/desktop/src-tauri/build.rs b/apps/desktop/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/apps/desktop/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/apps/desktop/src-tauri/capabilities/default.json b/apps/desktop/src-tauri/capabilities/default.json new file mode 100644 index 0000000..a1ee68a --- /dev/null +++ b/apps/desktop/src-tauri/capabilities/default.json @@ -0,0 +1,11 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Default capabilities for the OpsxDB main window", + "windows": [ + "main" + ], + "permissions": [ + "core:default" + ] +} diff --git a/apps/desktop/src-tauri/icons/128x128.png b/apps/desktop/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5d5a535b4ac362ac42400312c09c408f99daa4 GIT binary patch literal 7379 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 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square107x107Logo.png b/apps/desktop/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0c62ac509c86d1e7caf4459c4127debf181e1d GIT binary patch literal 6185 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 A@&Et; literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square284x284Logo.png b/apps/desktop/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8078d1dd12ce580669b86aaceaab7f9bef3e0a9d GIT binary patch literal 17920 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 Y2k&KFGa-DP761SM07*qoM6N<$g6LMETmS$7 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square310x310Logo.png b/apps/desktop/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1b1b8c22ee0a00aa10dda63655b31161a4e6243e GIT binary patch literal 19994 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 Bee(bS literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square89x89Logo.png b/apps/desktop/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a8250c6cae26f1604bdf5070fff8f765f7cedbe9 GIT binary patch literal 4985 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 D-rCik literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/StoreLogo.png b/apps/desktop/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..70abd6bb136d1ce3996c7d44127c862df7a9632e GIT binary patch literal 2539 zcmVYY1;PZxDHx-~Wo~hkWxB;l6b)`#5-A4P3T(Q?I2c{f$yAuk9}1t*PqS5}hanknR2 zIG=pCFC(L|;ZwHqrDcGm-@xDQr?*hwuU@3&*$&e1n&xy2`chdh*ki}yWaF>VP)8Lj zzD|MF_h)QP+ogb{UPzq&h&oo>PXllMgN#5Gk<&@UIMa_yacNri5sOi>yNBF!XH(tw zEo6S?iVPUdP9$sr@xh1GzU)p)Af$}y0O9pZXZ#4DG}EMHu$xST*!aCW$(-CIV8kPK zJV9p`-%hc&-T{az;^&w1r8yW(4>_k#rN&oV<+;vp^gR6wiXLrKp190G@WnQ=t!#78 zGg}lmgpz$`(QRb)fR*63%PyQo${mEiUR6nr2X~Vm-t|XHw4ci+b}e;JkG!`nrR2rH@XB)@ zr97JKI4^`@jITqu_T%-k0#ONP4-5=8&``JL5Mv^+!u@KM{7y5^Z9y54ccsOl zU-km`FKOkBurV9zsqeWR)c5>L>V4#c=f;JDKrr~wORW@r<4C60V3rF${u3w!9~K~Y z>NX4QsWmnd`N3^58>{)eDqQfoUR6OsgqRCna5jHFv+~iuAEW+1>=&`8dA&5@@E+w6 zfazNMBqculn2g#QwKydM!hFv;fz`Kq`XqUIAmCkgBaHH-YKc>t9XqN%*Rf(H1s+`m zrFxe7cke?3cLKE{CWcF61n_)C4jiV?j^B}9Q#~dSxdTblDdN=zjapcFy(U0jgbLRQ z?~?0N@tjmx!Bp}c#gE_I0ylg!9URH1z#))F`65jJCitIlqgA555%gQoR%3HQ5 zZHsC)uE|g@f4A@17sSi?fEXD_O4T}>r%}VM?HH6*WZz3DqoQrcsekXw6gkL4y!RzM zG>@A!4lT*ykA*Fo*TZbs1@Gmd}Li(edb&@a;INS^%>4-pUZ&Y)shusd4W}p z|LfnN&ZF?ae-#KO0#UCtyn?lr4zn=M$#j)?usmTZ)(VjP#zR#Nk6#oE_r#~reSso5 zycm#{(o1ZRbLMpN-}O~I?jYB!W(Ynv1Y$QO&q4gL7#wOCcXSYi>^;sK_q@4Ej({{G zFCU`BM<2^Q@=12>bW^iETGL{M!brjza?YM9A>mm#j~t(!GJJhRPH~OsYFRIVw1C`; z7my3$aA;fG@tp_NbR$qHA;n>8V?l_AX+EFihXKhl0i&FB{b420xvC{E<{B}yhW5r> z6NHWMoS7+d@HGnmW;YW40L9-wMdqX?GEmHf2>$ja*ytE)ice~f15{n{-Mgg~=Fnqd z8Gr92B|m8=A8HYM-Zf_?UOOe~Sr>_7m7uZo0kf0Z!o-L{=7zjwF1SNpS#6gzetGw61eFIK5VBmV%? zFaYW(lzMe-rrnhr^E96s3KPs~6g~#Q%qC%go}TMc?WXlK@z@~{#SB$vc!&T(sonfz z^?VF@Qj}KLW>9!o-QC$6L$WXk4|1sD-ft?#g2zN>F$ttU2hX~&O^~Tw-0#o-B2}$k zsc1UKeVO9TYIwfH^W*eWBs6QTny1!f7?6|ylle=*PRpt5vGp<`%zVdCy}QsmJRSJq z0|L-ax5#Db5P7v_P!<|Q-GRqeNxv?U2$2|sL}$Im2_0*DTXMr}ngE06fYuj?C%9gv zmv@lNDVTo8Fr;%#y+-I%qzJ--lU&p+K%KvDwMca7Gh~-Z)e7k>nbz??(=Kn#L*u=K+c7>cnnbdT_ zp_-w`oRF;Do3_eWKXLY)I_AV4GA;oisqQF{adpgz2jl*4bEDNoel*&8sG>gJ;Wcx#+>O{{dIh$sU=;z%Bp)002ovPDHLkV1oN3 B + + + + \ No newline at end of file diff --git a/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ec23ae9aa21197125018ac2f035c01fcb55b6aae GIT binary patch literal 2323 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

>t99n}NwQ`e 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 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb0fe7a41586b6d909af76e1eb6368854d1039c GIT binary patch literal 2237 zcmV;u2txOXP)%d+Iy4e9M((1%sU5n_;uOa>I7TA$iz_z=`8eNATtblpw!3dmlHvALELazuwqpP!j z>GTJOuEd9*AUy9LBtQKeaM9u(4}H73H>8#YJDH?!8=etIBQ)+ny$VHP9h1tR}I}%i_?$Y>i`FvgG66;;|^$E4{9G+fQk#wfs@HVH%%?C1Mzk1 zorX!5Qi8c?OM`G?@m-7e#FY(_=J%W1 z^+tXNqA#wJf`wDU%c%IActSZ+&RXH6T$-{ip9AU5TNK)G!4{e}yxm;v1bKR>8V+x@ zVU#bO$QHIKz4`n64%m@saS>$W(`o2cLG)R^SU$$!fv}rfpqWPTJK0%LlTA|4`5Y*k zq_{>>X&C+b!ZUmrJi`u0?cH;s2mG=td21pEn}yU`2e#?uiHvwE(#WQdiyYFj{201pHd325BlXp{(EIeF;*P-z?-WOk z{r82J^p5YeG4P%|3dv74pmD}5kr0wj1=gTZHoT_jNzT)5v@U-Eo)bsFq++gFG#?H1 z7bEk_R=E1~7K2%&c}E=wbI5^hOSq3bOc`#g9ql;>B!%dUqUuByQzkcjiP-A3=(A!8 z74;FQU34dsA8$bL(hFe>8X#$u6K+n%lE1@q?-u0JYe{z%Q4e}o^@@-l^9C7`(@e&o z{SkTgIYbseA%6$X9gms?b6^fVNQ_Mpp2y#MPuAeSqtCA-l3Fbs!n&uJV%AF*T5h*| zB=;K|VK?o7ok*zP2o_xxH3;9n5Q%jk$-T_)e|f($j;if9XsdW zM@8)JfsTwL!_Y_3=3;cnU{|kNc+WTm{;{XRJaC|jN~lVa7$HyNjO$gAQd*^d_!-uY z283?74*vRa@@)97`;q?X7g>kVtNR=fs7%A5NNbcbOj!Q$XOMBD;XZT-G@q~SQAQqz z&_wt9VeM>20eZ zb*+X*_{W_J-|1uIb}L0b@%~3Jh{SmPQu~d4vC5i*6804zB5mT z=eT3xIrb=F(_O8cjpU|pgmt4&J&)uUUsGLpm4u*OxaEdlR!=oIfoqT0rVqGuU0mPHS!os{1$;e|*Ax46Yn-uAHbDb8qjSK+H zHf)L?F4>D;{VA-H%wMyJl!V~6EV%y7%eY9)$(Y~>nQ)VwgmT8&D2cj-VRH`F4VSaaodATVhHdFvDd1Z{Z0 zx!wHm68v#eJrbX8RFmbLD(w=)Dd8BHG%>#e{t0K&$;dEuxWGkKX!Np?(lnRI4Awwh z9`JIF@EHNw;u(IlG*J0#fUug`leeA=QWHdR3Nt13$=ML^8T)E>U$ zUYeS1REKP)d(;0`6g>{TNW?hZUcR#{v ziR@|@%YE@UhMIqaq&fH9xnow2Jf~$x$E`hh@P)l6^?M!oFJAuu&$RP~l?s>}00000 LNkvXXu0mjf9AZpr literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..9fcd5d68cd7d9cc0bc64a6ac5ae44bf0ec461207 GIT binary patch literal 6208 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 eOIpXSUjG6hc3D6Ga6MQ6000094&@xz1!TT-` z)Y4ce7{PcIkVFd6@+xy^A&Q{OF6=$CGqXG0?R)Q^8O9*l>77}S#G$%+r>EzicYNRX z-uoL12l&f6&>b-P`vjNEwwf9*zUMaVOkNhN_FX&mdKP9WV^IJw0*`ojw)j zfH>S_m%QKag{;@;E1g}ps|z*1z666-JcinP7DLrk!%d|t=EQ%q!zdd%wgY8a@EtNr zE`?4$9`WDa0B}}pyWnK6>*NoQ_88@=)_5ITHA@#)^3R2@Z*VsU(y+aPZ$A9E_ zMCZ)L;FZe}pMSH&M4a7=6aQ&n`Rz3S5dEOjm6Ep(!6v);a|Dh%hIla=wM!PF>Ef&8 zy4&3Y6$-+4=#LRRb^?N@orKUSCz5jk`L6$nap-vP3D^ydP~ni~P`}Otxk$PEFQqeJ zkOH+XT!QG0SCXurjPQBW5S@Ds5|2EE(6mz#oIDYMN#xwu4Bp^(BYc5Jpk+b@MRf&6O~R3_|SMD-fn=2PPa@AhpX-qO6$l zxO^x3RRh{?T}rSr^t!#sYQ91neU3aI7JWS&mMl1JZMvY*i;eF7*QaQiw@9Nb5=LO+ zQDVH^vUPklvzmaI?t9IL>rRdq-099Rj^u0rfjb_;+#o(wrL{6ur4Gt-ZVn>SZ zGwbS*eDP)Y#*9MEHNQgUgO8DVZ5=Z2eTekhzmd#d2>%I#gN{(|K5t0)^$QX+3E zWO->BBw9p7XIG0zpf!9bLNm@n_?*)b_}K(eBh7;DYQ1fVUOy)Yl^^PvsH8GZG6}P$MwBD+^Rp2=X)?^g1EB(e!mSL8 z%m@Dp|j=< zB%WCTqZodDbzlz#Vnrc+&Qgja=beSR`|c1!ia+oE@MCl?e;%nf)*<`FHk~XYp$hnS zLm_u|IupW+stado(o^+qzw-e&9i1>JD^h{W=|;bEa9~UlsVq{JVwmI&b2^g5iEbFw zLL2pUVmN0*hMHm`iegy;!R(f;`iH9`1jQ*NS!9CkjktTA$o9yBkjfEqhR-MXoO=d* zV-JBjXrR{nqF3gf_mO^U6CH0Ov*|qzA8sAkcsjFltXS62A*f$|Km3OsDn#FT(QJW| zQ5)B_#N(u#nlEf$(6oTE{BGFE* zevNc}E%D%=uy-_SUrA~B9)?P4_3K)RsJNLFUH{?Z1n(@r>5YGf;SV48if0qw)8p%cz^{Hc62TCMh|?>9(mJBwt#C#Gh75!K#1!ZZVb(XN_m$xxn#t z-{^y-nDzX7Gbz?aB%Y)1j2laGd=A3ro{8w}%h3ME`(cnQBhy_nCoHdBCl@joJ$e^{ zh{)LGcG+&)38%SLCoEb6P&ORuZ)z9Jr8eSdJ*`pw;G_DI3y^vLBWb3@Npd(g_gdjj zdgHsa<^Vk#l;DKnc~`7>^y4WirQ2vuf1wv5S#%Q#gr**k8fqEX@$8q|k$Us5GIgm) z2*DGMrDGBlXP02b!QlBp_{147&62iSjIw8e+}Y_$7sg7KOztuV{NZ=hH(4?VwA^wl znr2;rrkR(bb^c>PM;M5ZkVnS0hm)*MU+aqXScIG^f zl@u*|M-yTT=OIQBl&Wf3h2E%P>iLo(BNWg@jGp!d52o}J+RABs2^vvMO}3JO%EpPa~~#v^EctFfP-m8pt9{>c+j wseSUG?|^?w`TzNx_ajwaTk^lez07*qoM6N<$f{7IKK>z>% literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1d934187effa5b524aed1ae61b89b11644a1ef66 GIT binary patch literal 5158 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 U`~vzts{jB107*qoM6N<$g7et^Jpcdz literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..23d33e05df1851eeea28238c78679428ec659ee9 GIT binary patch literal 12908 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 P9}JL|P!O*aH4OX@pAE=E literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..63134f361cd8f0cbe9980334ed92ccf0a59cf9f2 GIT binary patch literal 31713 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 WIccQ30o)JvMn*zWyh_wK;Qs)x8l_eM literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fdb659673baf10549b42f16bf1e9a544481bb0 GIT binary patch literal 9991 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 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml b/apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml new file mode 100644 index 0000000..ea9c223 --- /dev/null +++ b/apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #fff + \ No newline at end of file diff --git a/apps/desktop/src-tauri/icons/icon.icns b/apps/desktop/src-tauri/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..73fcf19ec8c7773cedc666d8f6968df8934b96bf GIT binary patch literal 237999 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 z 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

8jHiR#P=82#-jS@t@PsJa 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

mG#@9L<-*TDI0cJGyE%sH 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

w?{+7BnPPR&RmSf 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 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/icon.png b/apps/desktop/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..03b7766c7dbbea0d6d34ebbecc1c8afc2eccb800 GIT binary patch literal 37850 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%0DKSC5GBPnh2;#ln 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 a7$L9btS{9s<*fmi1hTwjXI^9G8TVhtLX7JG literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/icon.svg b/apps/desktop/src-tauri/icons/icon.svg new file mode 100644 index 0000000..8accdbc --- /dev/null +++ b/apps/desktop/src-tauri/icons/icon.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..b32b5cea7551e1ed0aa0253093a9ce79263da1d7 GIT binary patch literal 898 zcmV-|1AY97P)EC?WbV ziu#ZWOOvF>M?p|zWQrjcH0X@ZjB~H!ow=ud&Q-^8H1NRXKF&RBueJ9&`>0$DO~;_` zGPD=1FvAhdW+>TiICqpG*LMocIS0&)M!A2_VT`r64` z-N%OrGX5@>CO8z28;ThjP6wmKLPqxSBk(@B1(PCAFcm3L2|STV0&XO=j2hC0|77*C=!9$PtTc|U>WvQ)&h4rKrTWGMX^x`2jrYN24__T;{JZj*}4hy zuGXRGOFLY2l1X>DBe6MSuPn&Z)pe1 za>`0i4=5}kaw;Yk7bBx|4b)|e5vtq=wYUh0KoELsI|^PrMDUakMrW4{fOsOAuHNF+ ze4?rj2Qt@{!d1N;j?EjuM-7B;+(qPmBQc7Bhlf$v`jk{C_*-?r^6eycNrocX!9jRx z_9OS=8Tmo^4`y{)}43f}|*oRM+ z^VhFM&goiYtSEur+y)+x!}!@nDT!iky${hRO)v+CWT45FRwf%&I9+RgjlhWu__MAY z!Si)+?WrcunQ$LIh=pI?fsc$J-uD}Mx3AE1EX_6+!%3iGgDX@yQDLsf;M`eGvU`ws ztq!9dop9}{fLd4p`;tY{i~7qpTH~AmPPYy10GSsdg=C7P&%bw_BtCS&3 z5oVHV2cMLpBsaT~t+8i%nrk!(V*}+VfYI z=f(|8AbczxVhvO662ne%?0ssI2 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ceeee7fa082b5f28e3b0f0f077b5f565eca95f61 GIT binary patch literal 1970 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 N002ovPDHLkV1iPWgJu8# literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b6745824691bc49c3886970c66cc51ac56bfb7 GIT binary patch literal 3072 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

2%|cVeeP5WVJt--?8OifOhxMI3oIb9)jumQ`SL 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 H=>Fh;fv7x- literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1851a0022d0cc8a84b0d3748c397db86d65af0e5 GIT binary patch literal 6981 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
2%|cVeeP5WVJt--?8OifOhxMI3oIb9)jumQ`SL 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

连库入门

+

在连库页选择驱动,填写主机 / 端口 / 账号,测试通过后保存并打开。

+
    +
  • 密码仅存本机(本地加密存储)。
  • +
  • 会话由本地后端维护;后端未启动时顶部会提示,不会白屏。
  • +
  • 断线后可在底栏重连,恢复当前库上下文。
  • +
\ No newline at end of file diff --git a/apps/server/internal/docs/content/faq.html b/apps/server/internal/docs/content/faq.html new file mode 100644 index 0000000..12ba477 --- /dev/null +++ b/apps/server/internal/docs/content/faq.html @@ -0,0 +1,7 @@ +

常见问题

+

打开后提示本地后端未就绪?

+

确认应用已拉起 sidecar;或手动 ./run.sh server 后重试。默认只监听 127.0.0.1:8788。

+

浏览器也能用吗?

+

可以调试,但产品说明与对外沟通应以桌面版为准,不要暗示 Web 即产品。

+

官网 / 文档在哪?

+

本地后端提供:http://127.0.0.1:8788/(官网)、/docs(文档)。

\ No newline at end of file diff --git a/apps/server/internal/docs/content/install.html b/apps/server/internal/docs/content/install.html new file mode 100644 index 0000000..550a417 --- /dev/null +++ b/apps/server/internal/docs/content/install.html @@ -0,0 +1,13 @@ +

安装与启动

+

OpsxDB 正式形态是桌面 GUI(Tauri)。开发态浏览器 :5174 只用于调试,不是产品交付。

+

桌面版

+
    +
  1. 安装本机构建产物(macOS .dmg / .app,或 npm run build:desktop 产出)。
  2. +
  3. 双击启动:应用会拉起本地后端(默认 127.0.0.1:8788),进入工作台。
  4. +
  5. 无需手动执行 ./run.sh web。
  6. +
+

开发调试

+
./run.sh gui   # 或 ./run.sh web
+
+

开发壳地址:http://127.0.0.1:5174。

+

改后端(apps/server)后请执行 ./run.sh restart(或等价重启 Gin),避免 :8788 仍跑旧二进制。

diff --git a/apps/server/internal/docs/content/workbench.html b/apps/server/internal/docs/content/workbench.html new file mode 100644 index 0000000..c617bec --- /dev/null +++ b/apps/server/internal/docs/content/workbench.html @@ -0,0 +1,7 @@ +

工作台简介

+

深色密度布局:左侧连接与对象树,中间编辑器与多结果 Tab,可选 AI 侧栏。

+
    +
  • 多结果集:成功结果保留;失败不盖掉已有成功集。
  • +
  • 执行计划:有则展示,无则禁用。
  • +
  • 书签:紧凑列表,回填 SQL,本地持久化。
  • +
\ No newline at end of file diff --git a/apps/server/internal/docs/docs.go b/apps/server/internal/docs/docs.go new file mode 100644 index 0000000..ab90030 --- /dev/null +++ b/apps/server/internal/docs/docs.go @@ -0,0 +1,89 @@ +// Package docs:用户文档骨架(嵌入 HTML,侧栏+正文密度对齐工作台)。 +package docs + +import ( + "embed" + "net/http" + "strings" + + "github.com/gin-gonic/gin" +) + +//go:embed content assets template.html +var files embed.FS + +type page struct { + Slug string + Title string + Body string +} + +var order = []page{ + {Slug: "install", Title: "安装与启动"}, + {Slug: "connect", Title: "连库入门"}, + {Slug: "workbench", Title: "工作台简介"}, + {Slug: "faq", Title: "常见问题"}, +} + +type Handler struct { + tpl string +} + +func New() *Handler { + raw, err := files.ReadFile("template.html") + if err != nil { + panic("docs: template.html 缺失: " + err.Error()) + } + return &Handler{tpl: string(raw)} +} + +func (h *Handler) Register(r *gin.Engine) { + r.GET("/docs", func(c *gin.Context) { c.Redirect(http.StatusFound, "/docs/install") }) + r.GET("/docs/:slug", h.Page) + r.GET("/docs/assets/*file", h.Asset) +} + +func (h *Handler) Page(c *gin.Context) { + slug := c.Param("slug") + bodyBytes, err := files.ReadFile("content/" + slug + ".html") + if err != nil { + c.Status(http.StatusNotFound) + return + } + title := slug + nav := strings.Builder{} + for _, p := range order { + cls := "nav-link" + if p.Slug == slug { + cls += " active" + title = p.Title + } + nav.WriteString(`
` + p.Title + ``) + } + html := h.tpl + html = strings.ReplaceAll(html, "{{TITLE}}", title) + html = strings.ReplaceAll(html, "{{NAV}}", nav.String()) + html = strings.ReplaceAll(html, "{{BODY}}", string(bodyBytes)) + c.Header("Content-Type", "text/html; charset=utf-8") + c.Header("Cache-Control", "no-cache") + _, _ = c.Writer.WriteString(html) +} + +func (h *Handler) Asset(c *gin.Context) { + name := strings.TrimPrefix(c.Param("file"), "/") + if strings.Contains(name, "..") { + c.Status(http.StatusBadRequest) + return + } + data, err := files.ReadFile("assets/" + name) + if err != nil { + c.Status(http.StatusNotFound) + return + } + ct := "application/octet-stream" + if strings.HasSuffix(name, ".css") { + ct = "text/css; charset=utf-8" + } + c.Header("Content-Type", ct) + c.Data(http.StatusOK, ct, data) +} diff --git a/apps/server/internal/docs/template.html b/apps/server/internal/docs/template.html new file mode 100644 index 0000000..9198619 --- /dev/null +++ b/apps/server/internal/docs/template.html @@ -0,0 +1,19 @@ + + + + + +{{TITLE}} · OpsxDB 文档 + + + +
+ OpsxDB 文档 + +
+
+ +
{{BODY}}
+
+ + diff --git a/apps/server/internal/proxy/guard.go b/apps/server/internal/proxy/guard.go new file mode 100644 index 0000000..fc2184e --- /dev/null +++ b/apps/server/internal/proxy/guard.go @@ -0,0 +1,36 @@ +package proxy + +import ( + "fmt" + "net" + "net/url" + "strings" +) + +var blockedHosts = map[string]struct{}{ + "169.254.169.254": {}, + "metadata.google.internal": {}, +} + +// ValidateURL applies MVP SSRF basics. Week 2 should add configurable CIDR +// deny-lists and DNS-rebinding protection before exposing this beyond localhost. +func ValidateURL(raw string) (*url.URL, error) { + u, err := url.Parse(raw) + if err != nil { + return nil, fmt.Errorf("invalid url: %w", err) + } + if u.Scheme != "http" && u.Scheme != "https" { + return nil, fmt.Errorf("only http/https schemes are allowed") + } + if u.Hostname() == "" { + return nil, fmt.Errorf("url host is required") + } + host := strings.ToLower(strings.TrimSuffix(u.Hostname(), ".")) + if _, blocked := blockedHosts[host]; blocked { + return nil, fmt.Errorf("blocked metadata host") + } + if ip := net.ParseIP(host); ip != nil && ip.Equal(net.ParseIP("169.254.169.254")) { + return nil, fmt.Errorf("blocked metadata address") + } + return u, nil +} diff --git a/apps/server/internal/proxy/guard_test.go b/apps/server/internal/proxy/guard_test.go new file mode 100644 index 0000000..2750500 --- /dev/null +++ b/apps/server/internal/proxy/guard_test.go @@ -0,0 +1,23 @@ +package proxy + +import "testing" + +func TestValidateURL(t *testing.T) { + for _, tc := range []struct { + raw string + ok bool + }{ + {"https://example.com/a", true}, + {"file:///etc/passwd", false}, + {"http://169.254.169.254/latest/meta-data", false}, + {"http://metadata.google.internal/computeMetadata/v1", false}, + } { + _, err := ValidateURL(tc.raw) + if tc.ok && err != nil { + t.Fatalf("%s: %v", tc.raw, err) + } + if !tc.ok && err == nil { + t.Fatalf("expected rejection: %s", tc.raw) + } + } +} diff --git a/apps/server/internal/proxy/handler.go b/apps/server/internal/proxy/handler.go new file mode 100644 index 0000000..8fa1a87 --- /dev/null +++ b/apps/server/internal/proxy/handler.go @@ -0,0 +1,111 @@ +package proxy + +import ( + "bytes" + "io" + "net/http" + "strings" + "time" + + "github.com/gin-gonic/gin" +) + +const maxResponseBytes = 10 << 20 // 10 MiB MVP safety cap + +type Handler struct { + BaseClient *http.Client +} + +func NewHandler() *Handler { + return &Handler{BaseClient: &http.Client{Timeout: 30 * time.Second}} +} + +func (h *Handler) ProxyHTTP(c *gin.Context) { + var spec HttpSpec + if err := c.ShouldBindJSON(&spec); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "invalid HttpSpec", "detail": err.Error()}) + return + } + + method := strings.ToUpper(spec.Method) + switch method { + case http.MethodGet, http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete: + default: + c.JSON(http.StatusBadRequest, gin.H{"error": "unsupported method"}) + return + } + + u, err := ValidateURL(spec.URL) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + query := u.Query() + for key, value := range spec.Query { + query.Set(key, value) + } + u.RawQuery = query.Encode() + + var body io.Reader + if spec.Body != nil && spec.Body.Mode != "none" && method != http.MethodGet { + body = bytes.NewBufferString(spec.Body.Raw) + } + + req, err := http.NewRequestWithContext(c.Request.Context(), method, u.String(), body) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "cannot create request", "detail": err.Error()}) + return + } + for key, value := range spec.Headers { + // Hop-by-hop headers are managed by net/http. + if !isHopByHop(key) { + req.Header.Set(key, value) + } + } + if spec.Body != nil && spec.Body.Mode == "json" && req.Header.Get("Content-Type") == "" { + req.Header.Set("Content-Type", "application/json") + } + + client := h.BaseClient + if spec.TimeoutMS > 0 { + client = &http.Client{Timeout: time.Duration(spec.TimeoutMS) * time.Millisecond} + } + started := time.Now() + res, err := client.Do(req) + if err != nil { + c.JSON(http.StatusBadGateway, gin.H{"error": "upstream request failed", "detail": err.Error()}) + return + } + defer res.Body.Close() + + payload, err := io.ReadAll(io.LimitReader(res.Body, maxResponseBytes+1)) + if err != nil { + c.JSON(http.StatusBadGateway, gin.H{"error": "cannot read upstream response", "detail": err.Error()}) + return + } + if len(payload) > maxResponseBytes { + c.JSON(http.StatusBadGateway, gin.H{"error": "upstream response exceeds 10 MiB limit"}) + return + } + + headers := make(map[string]string, len(res.Header)) + for key, values := range res.Header { + headers[strings.ToLower(key)] = strings.Join(values, ", ") + } + c.JSON(http.StatusOK, HttpResult{ + Status: res.StatusCode, + Headers: headers, + Body: string(payload), + TimeMS: time.Since(started).Milliseconds(), + Size: len(payload), + }) +} + +func isHopByHop(name string) bool { + switch strings.ToLower(name) { + case "connection", "keep-alive", "proxy-authenticate", "proxy-authorization", "te", "trailer", "transfer-encoding", "upgrade", "host", "content-length": + return true + default: + return false + } +} diff --git a/apps/server/internal/proxy/types.go b/apps/server/internal/proxy/types.go new file mode 100644 index 0000000..e945925 --- /dev/null +++ b/apps/server/internal/proxy/types.go @@ -0,0 +1,23 @@ +package proxy + +type BodySpec struct { + Mode string `json:"mode"` + Raw string `json:"raw,omitempty"` +} + +type HttpSpec struct { + Method string `json:"method" binding:"required"` + URL string `json:"url" binding:"required"` + Headers map[string]string `json:"headers"` + Query map[string]string `json:"query,omitempty"` + Body *BodySpec `json:"body,omitempty"` + TimeoutMS int `json:"timeoutMs,omitempty"` +} + +type HttpResult struct { + Status int `json:"status"` + Headers map[string]string `json:"headers"` + Body string `json:"body"` + TimeMS int64 `json:"timeMs"` + Size int `json:"size"` +} diff --git a/apps/server/internal/server/router.go b/apps/server/internal/server/router.go new file mode 100644 index 0000000..eb8d024 --- /dev/null +++ b/apps/server/internal/server/router.go @@ -0,0 +1,229 @@ +package server + +import ( + "net/http" + "strings" + + "github.com/gin-gonic/gin" + "opsxdb/server/internal/ai" + "opsxdb/server/internal/db" + "opsxdb/server/internal/docs" + "opsxdb/server/internal/site" +) + +func NewRouter() *gin.Engine { + r := gin.New() + _ = r.SetTrustedProxies(nil) + r.Use(gin.Logger(), gin.Recovery(), localhostCORS()) + + r.GET("/health", health) + r.GET("/api/health", health) + + docs.New().Register(r) + site.New().Register(r) + + api := r.Group("/api") + { + api.POST("/db/test-connection", func(c *gin.Context) { + req, err := bindConn(c, false) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"ok": false, "error": err.Error()}) + return + } + if err := db.TestConnection(req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"ok": false, "error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"ok": true, "message": "connected"}) + }) + + api.POST("/db/open", func(c *gin.Context) { + req, err := bindConn(c, false) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + id, err := db.OpenSession(req) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"ok": true, "sessionId": id, "message": "connected"}) + }) + + api.POST("/db/close", func(c *gin.Context) { + var req db.ConnReq + _ = c.ShouldBindJSON(&req) + if req.SessionID != "" { + db.CloseSession(req.SessionID) + } + c.JSON(http.StatusOK, gin.H{"ok": true}) + }) + + api.POST("/db/databases", func(c *gin.Context) { + req, err := bindConn(c, true) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + list, err := db.ListDatabases(req) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"databases": list}) + }) + + api.POST("/db/tables", func(c *gin.Context) { + req, err := bindConn(c, true) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + list, err := db.ListTables(req) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"tables": list}) + }) + + api.POST("/db/columns", func(c *gin.Context) { + req, err := bindConn(c, true) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + list, err := db.ListColumns(req) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"columns": list}) + }) + + api.POST("/db/exec", func(c *gin.Context) { + req, err := bindConn(c, true) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + res := db.ExecSQL(c.Request.Context(), req) + c.JSON(http.StatusOK, res) + }) + + api.POST("/db/redis/keys", func(c *gin.Context) { + req, err := bindConn(c, true) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + if !db.IsRedisDriver(req.Driver) { + c.JSON(http.StatusBadRequest, gin.H{"error": "仅 Redis 可用"}) + return + } + res := db.ListRedisKeys(req) + if res.Error != "" { + c.JSON(http.StatusBadRequest, res) + return + } + c.JSON(http.StatusOK, res) + }) + + api.POST("/db/redis/key", func(c *gin.Context) { + req, err := bindConn(c, true) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + if !db.IsRedisDriver(req.Driver) { + c.JSON(http.StatusBadRequest, gin.H{"error": "仅 Redis 可用"}) + return + } + res := db.GetRedisKey(req) + if res.Error != "" && res.Type == "" { + c.JSON(http.StatusBadRequest, res) + return + } + c.JSON(http.StatusOK, res) + }) + + api.POST("/db/redis/key/delete", func(c *gin.Context) { + req, err := bindConn(c, true) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + if !db.IsRedisDriver(req.Driver) { + c.JSON(http.StatusBadRequest, gin.H{"error": "仅 Redis 可用"}) + return + } + res := db.DeleteRedisKey(req) + if res.Error != "" { + c.JSON(http.StatusBadRequest, res) + return + } + c.JSON(http.StatusOK, res) + }) + + api.POST("/ai/chat", func(c *gin.Context) { + var req ai.ChatReq + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, ai.Chat(req)) + }) + + api.POST("/ai/generate", func(c *gin.Context) { + var req ai.ChatReq + _ = c.ShouldBindJSON(&req) + req.Action = "generate" + c.JSON(http.StatusOK, ai.Chat(req)) + }) + } + + return r +} + +func bindConn(c *gin.Context, allowSession bool) (db.ConnReq, error) { + var req db.ConnReq + if err := c.ShouldBindJSON(&req); err != nil { + return req, err + } + if allowSession && req.SessionID != "" { + return db.ResolveConn(req) + } + return req, nil +} + +func health(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{"ok": true, "service": "opsxdb"}) +} + +func localhostCORS() gin.HandlerFunc { + allowed := map[string]struct{}{ + "http://localhost:5174": {}, + "http://127.0.0.1:5174": {}, + "http://localhost:5173": {}, + "http://127.0.0.1:5173": {}, + "http://localhost:1420": {}, + "http://127.0.0.1:1420": {}, + "tauri://localhost": {}, + "http://tauri.localhost": {}, + } + return func(c *gin.Context) { + origin := c.GetHeader("Origin") + if _, ok := allowed[strings.TrimSuffix(origin, "/")]; ok { + c.Header("Access-Control-Allow-Origin", origin) + c.Header("Vary", "Origin") + c.Header("Access-Control-Allow-Headers", "Content-Type, Authorization") + c.Header("Access-Control-Allow-Methods", "GET, POST, OPTIONS") + } + if c.Request.Method == http.MethodOptions { + c.AbortWithStatus(http.StatusNoContent) + return + } + c.Next() + } +} diff --git a/apps/server/internal/site/assets/site.css b/apps/server/internal/site/assets/site.css new file mode 100644 index 0000000..16d74d5 --- /dev/null +++ b/apps/server/internal/site/assets/site.css @@ -0,0 +1,50 @@ +:root { + --bg: #0e1116; + --panel: #151a21; + --border: #243044; + --text: #e6edf7; + --muted: #8b9bb4; + --accent: #3b82f6; +} +* { box-sizing: border-box; } +body { + margin: 0; + font: 14px/1.55 ui-sans-serif, system-ui, -apple-system, sans-serif; + background: var(--bg); + color: var(--text); +} +.nav { border-bottom: 1px solid var(--border); background: var(--panel); } +.nav .inner { + max-width: 880px; margin: 0 auto; padding: 0 20px; height: 48px; + display: flex; align-items: center; justify-content: space-between; +} +.brand { display: flex; align-items: center; gap: 10px; color: var(--text); text-decoration: none; font-weight: 600; } +.logo { + width: 28px; height: 28px; border-radius: 7px; background: var(--accent); + display: grid; place-items: center; font-size: 11px; font-weight: 700; color: #fff; +} +.nav a { color: var(--muted); text-decoration: none; margin-left: 16px; font-size: 13px; } +.nav a:hover { color: var(--text); } +.hero { max-width: 880px; margin: 0 auto; padding: 56px 20px 72px; } +.eyebrow { color: var(--accent); font-size: 12px; letter-spacing: .04em; margin: 0 0 12px; } +h1 { font-size: 28px; line-height: 1.25; margin: 0 0 14px; font-weight: 650; } +.lead { color: var(--muted); max-width: 52ch; margin: 0 0 24px; } +.actions { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 36px; } +.btn { + display: inline-flex; align-items: center; height: 36px; padding: 0 14px; + border-radius: 8px; text-decoration: none; font-size: 13px; font-weight: 550; + border: 1px solid var(--border); +} +.btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; } +.btn.ghost { color: var(--text); background: transparent; } +.caps { list-style: none; padding: 0; margin: 0; display: grid; gap: 10px; } +.caps li { + background: var(--panel); border: 1px solid var(--border); border-radius: 10px; + padding: 12px 14px; display: grid; gap: 4px; +} +.caps strong { font-size: 13px; } +.caps span { color: var(--muted); font-size: 12.5px; } +.foot { + border-top: 1px solid var(--border); color: var(--muted); + text-align: center; padding: 18px; font-size: 12px; +} diff --git a/apps/server/internal/site/site.go b/apps/server/internal/site/site.go new file mode 100644 index 0000000..2b9b8d4 --- /dev/null +++ b/apps/server/internal/site/site.go @@ -0,0 +1,58 @@ +// Package site:产品官网落地页(嵌入二进制,深色密度跟工作台)。 +package site + +import ( + "embed" + "net/http" + "strings" + + "github.com/gin-gonic/gin" +) + +//go:embed template.html assets +var files embed.FS + +type Handler struct { + html string +} + +func New() *Handler { + raw, err := files.ReadFile("template.html") + if err != nil { + panic("site: template.html 缺失: " + err.Error()) + } + return &Handler{html: string(raw)} +} + +func (h *Handler) Register(r *gin.Engine) { + r.GET("/", h.Page) + r.GET("/home", h.Page) + r.GET("/index.html", h.Page) + r.GET("/site/assets/*file", h.Asset) +} + +func (h *Handler) Page(c *gin.Context) { + c.Header("Content-Type", "text/html; charset=utf-8") + c.Header("Cache-Control", "no-cache") + _, _ = c.Writer.WriteString(h.html) +} + +func (h *Handler) Asset(c *gin.Context) { + name := strings.TrimPrefix(c.Param("file"), "/") + if strings.Contains(name, "..") { + c.Status(http.StatusBadRequest) + return + } + data, err := files.ReadFile("assets/" + name) + if err != nil { + c.Status(http.StatusNotFound) + return + } + ct := "application/octet-stream" + if strings.HasSuffix(name, ".css") { + ct = "text/css; charset=utf-8" + } + c.Header("Content-Type", ct) + c.Header("Cache-Control", "public, max-age=3600") + c.Data(http.StatusOK, ct, data) +} diff --git a/apps/server/internal/site/template.html b/apps/server/internal/site/template.html new file mode 100644 index 0000000..9767bde --- /dev/null +++ b/apps/server/internal/site/template.html @@ -0,0 +1,36 @@ + + + + + +OpsxDB — 本地优先的桌面数据库工作台 + + + + + +
+

桌面 GUI · 本地优先

+

连库、写 SQL、看结果——都在本机完成

+

正式形态是可安装的桌面应用,本地后端随应用启动。浏览器里的 :5174 只是开发壳,不是产品。

+ +
    +
  • 多驱动连库MySQL / Postgres / SQLite 等,会话保活
  • +
  • 工作台密度结果集、对象树、书签,深色紧凑布局
  • +
  • 本机后端双击启动即带本地服务,不依赖手动起 Vite
  • +
+
+
© 2026 OpsxDB · 产品形态为桌面 GUI
+ + diff --git a/apps/web/index.html b/apps/web/index.html new file mode 100644 index 0000000..5d0b739 --- /dev/null +++ b/apps/web/index.html @@ -0,0 +1,14 @@ + + + + + + + + OpsxDB + + +
+ + + diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..6c52170 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,30 @@ +{ + "name": "@opsxdb/web", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --host 127.0.0.1 --port 5174", + "build": "tsc -b && vite build", + "preview": "vite preview --host 127.0.0.1 --port 5174" + }, + "dependencies": { + "@opsxdb/core": "*", + "@opsxdb/transport": "*", + "@opsxdb/ui": "*", + "@tauri-apps/api": "^2.5.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/node": "^22.20.3", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.4.1", + "autoprefixer": "^10.4.21", + "postcss": "^8.5.3", + "tailwindcss": "^3.4.17", + "typescript": "^5.8.2", + "vite": "^6.2.2" + } +} diff --git a/apps/web/postcss.config.js b/apps/web/postcss.config.js new file mode 100644 index 0000000..2aa7205 --- /dev/null +++ b/apps/web/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/apps/web/public/favicon.svg b/apps/web/public/favicon.svg new file mode 100644 index 0000000..8accdbc --- /dev/null +++ b/apps/web/public/favicon.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/apps/web/public/icons/databases/dameng.svg b/apps/web/public/icons/databases/dameng.svg new file mode 100644 index 0000000..5315156 --- /dev/null +++ b/apps/web/public/icons/databases/dameng.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/elasticsearch.svg b/apps/web/public/icons/databases/elasticsearch.svg new file mode 100644 index 0000000..0da0d70 --- /dev/null +++ b/apps/web/public/icons/databases/elasticsearch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/gaussdb.svg b/apps/web/public/icons/databases/gaussdb.svg new file mode 100644 index 0000000..f115a85 --- /dev/null +++ b/apps/web/public/icons/databases/gaussdb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/influxdb.svg b/apps/web/public/icons/databases/influxdb.svg new file mode 100644 index 0000000..a6ed507 --- /dev/null +++ b/apps/web/public/icons/databases/influxdb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/kingbase.svg b/apps/web/public/icons/databases/kingbase.svg new file mode 100644 index 0000000..9d7f076 --- /dev/null +++ b/apps/web/public/icons/databases/kingbase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/mariadb.svg b/apps/web/public/icons/databases/mariadb.svg new file mode 100644 index 0000000..33794b1 --- /dev/null +++ b/apps/web/public/icons/databases/mariadb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/mongodb.svg b/apps/web/public/icons/databases/mongodb.svg new file mode 100644 index 0000000..8660ced --- /dev/null +++ b/apps/web/public/icons/databases/mongodb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/mysql.svg b/apps/web/public/icons/databases/mysql.svg new file mode 100644 index 0000000..853c55f --- /dev/null +++ b/apps/web/public/icons/databases/mysql.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/oceanbase.svg b/apps/web/public/icons/databases/oceanbase.svg new file mode 100644 index 0000000..2ace405 --- /dev/null +++ b/apps/web/public/icons/databases/oceanbase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/opengauss.svg b/apps/web/public/icons/databases/opengauss.svg new file mode 100644 index 0000000..6f46971 --- /dev/null +++ b/apps/web/public/icons/databases/opengauss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/oracle.svg b/apps/web/public/icons/databases/oracle.svg new file mode 100644 index 0000000..f5449b2 --- /dev/null +++ b/apps/web/public/icons/databases/oracle.svg @@ -0,0 +1 @@ +Oracle \ No newline at end of file diff --git a/apps/web/public/icons/databases/polardb.png b/apps/web/public/icons/databases/polardb.png new file mode 100644 index 0000000000000000000000000000000000000000..197ba7528072fb1790712ce7c9f4cf1a5fa6941e GIT binary patch literal 3908 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 \ No newline at end of file diff --git a/apps/web/public/icons/databases/redis.svg b/apps/web/public/icons/databases/redis.svg new file mode 100644 index 0000000..1981b34 --- /dev/null +++ b/apps/web/public/icons/databases/redis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/sqlite.svg b/apps/web/public/icons/databases/sqlite.svg new file mode 100644 index 0000000..dde0558 --- /dev/null +++ b/apps/web/public/icons/databases/sqlite.svg @@ -0,0 +1,7 @@ + + SQLite + + + + + diff --git a/apps/web/public/icons/databases/sqlserver.svg b/apps/web/public/icons/databases/sqlserver.svg new file mode 100644 index 0000000..b23e83d --- /dev/null +++ b/apps/web/public/icons/databases/sqlserver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/tdsql.svg b/apps/web/public/icons/databases/tdsql.svg new file mode 100644 index 0000000..65627ff --- /dev/null +++ b/apps/web/public/icons/databases/tdsql.svg @@ -0,0 +1,15 @@ + + + + + + + Tencent Cloud + + + + + + + + diff --git a/apps/web/public/icons/databases/tidb.svg b/apps/web/public/icons/databases/tidb.svg new file mode 100644 index 0000000..ee0b723 --- /dev/null +++ b/apps/web/public/icons/databases/tidb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/databases/zookeeper.svg b/apps/web/public/icons/databases/zookeeper.svg new file mode 100644 index 0000000..a281bab --- /dev/null +++ b/apps/web/public/icons/databases/zookeeper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/icons/icon-512.png b/apps/web/public/icons/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..165a23b89ca814a4b9ee1f1819d141ed770b8966 GIT binary patch literal 59414 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 literal 0 HcmV?d00001 diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx new file mode 100644 index 0000000..71f95e6 --- /dev/null +++ b/apps/web/src/main.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import { OpsxWorkspace } from "@opsxdb/ui"; +import "./styles.css"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css new file mode 100644 index 0000000..b868a70 --- /dev/null +++ b/apps/web/src/styles.css @@ -0,0 +1,427 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + /* Design tokens v1 — TablePlus/DataGrip density */ + color-scheme: dark; + --ops-bg: #0e1116; + --ops-surface: #151a21; + --ops-surface-2: #1a212b; + --ops-border: #2a3340; + --ops-border-soft: #1f2733; + --ops-muted: #8b95a5; + --ops-text: #e8edf5; + --ops-accent: #3b82f6; + --ops-accent-strong: #2563eb; + --ops-row-alt: rgba(26, 33, 43, 0.65); + --ops-toolbar-h: 36px; + --ops-tab-h: 32px; + --ops-row-h: 28px; + --ops-statusbar-h: 24px; + --ops-sidebar-w: 260px; + --ops-font-xs: 11px; + --ops-font-sm: 12.5px; + --ops-font-md: 14px; + --ops-bg-active: color-mix(in srgb, var(--ops-accent) 16%, transparent); + --ops-danger: #ef4444; + --ops-warn: #f59e0b; + } + html.light { + color-scheme: light; + --ops-bg: #f1f5f9; + --ops-surface: #ffffff; + --ops-surface-2: #f8fafc; + --ops-border: #e2e8f0; + --ops-border-soft: #eef2f7; + --ops-muted: #64748b; + --ops-text: #1e293b; + --ops-accent: #0891b2; + --ops-accent-strong: #0e7490; + --ops-row-alt: #f8fafc; + --ops-danger: #dc2626; + --ops-warn: #d97706; + } + * { scrollbar-color: #334155 transparent; scrollbar-width: thin; } + html.light * { scrollbar-color: #cbd5e1 transparent; } + body { + @apply m-0 font-sans antialiased; + background: var(--ops-bg); + color: var(--ops-text); + } + button, input, select, textarea { font: inherit; } +} + +@layer components { + .ops-shell { + background: var(--ops-bg); + color: var(--ops-text); + } + + .ops-input { + @apply rounded border px-2 py-1 outline-none transition; + font-size: var(--ops-font-sm); + border-color: var(--ops-border); + background: var(--ops-surface-2); + color: var(--ops-text); + } + .ops-input::placeholder { color: var(--ops-muted); opacity: 0.7; } + .ops-input:focus { + border-color: var(--ops-accent); + box-shadow: 0 0 0 1px color-mix(in srgb, var(--ops-accent) 35%, transparent); + } + + .ops-btn-primary { + @apply inline-flex items-center justify-center rounded px-2.5 font-semibold text-white shadow-sm transition disabled:cursor-not-allowed disabled:opacity-50; + height: var(--ops-row-h); + font-size: var(--ops-font-sm); + background: var(--ops-accent-strong); + } + .ops-btn-primary:hover:not(:disabled) { background: var(--ops-accent); } + + .ops-btn-secondary { + @apply inline-flex items-center justify-center rounded border px-2 transition; + height: var(--ops-row-h); + font-size: var(--ops-font-sm); + border-color: var(--ops-border); + background: var(--ops-surface-2); + color: var(--ops-text); + } + .ops-btn-secondary:hover { + border-color: color-mix(in srgb, var(--ops-accent) 45%, var(--ops-border)); + background: color-mix(in srgb, var(--ops-accent) 8%, var(--ops-surface-2)); + } + + .ops-btn-ghost { + @apply inline-flex items-center justify-center rounded px-1.5 transition; + height: var(--ops-row-h); + font-size: var(--ops-font-sm); + color: var(--ops-muted); + } + .ops-btn-ghost:hover { + color: var(--ops-text); + background: color-mix(in srgb, var(--ops-accent) 10%, transparent); + } + + .ops-btn-ai { + @apply rounded border px-1.5 py-0.5 text-[11px] font-medium transition; + border-color: var(--ops-border); + background: var(--ops-surface-2); + color: var(--ops-text); + } + .ops-btn-ai:hover:not(:disabled) { + border-color: color-mix(in srgb, var(--ops-accent) 50%, var(--ops-border)); + color: var(--ops-accent); + } + .ops-btn-ai:disabled { opacity: 0.5; cursor: not-allowed; } + + .ops-tabbar { + @apply flex shrink-0 items-stretch gap-0.5 border-b px-1; + height: var(--ops-tab-h); + border-color: var(--ops-border); + background: var(--ops-surface-2); + } + .ops-empty { + @apply flex flex-1 flex-col items-center justify-center gap-3 px-6 text-center; + color: var(--ops-muted); + background: var(--ops-bg); + } + .ops-empty h2 { + @apply m-0 font-semibold; + font-size: var(--ops-font-md); + color: var(--ops-text); + } + .ops-empty p { + @apply m-0 max-w-sm; + font-size: var(--ops-font-sm); + } + .ops-conn-row { + @apply flex w-full items-center gap-3 border-b px-3 text-left transition; + min-height: 44px; + border-color: var(--ops-border-soft); + background: var(--ops-surface); + } + .ops-conn-row:hover { + background: color-mix(in srgb, var(--ops-accent) 8%, var(--ops-surface)); + } + .ops-section-card { + @apply space-y-2 rounded border p-3; + border-color: var(--ops-border); + background: var(--ops-surface); + } + .ops-section-title { + @apply mb-1 font-semibold; + font-size: var(--ops-font-xs); + color: var(--ops-muted); + letter-spacing: 0.04em; + text-transform: uppercase; + } + .ops-tab { + @apply border-b-2 border-transparent px-2.5 py-1.5 text-[12px] font-medium transition; + color: var(--ops-muted); + } + .ops-tab:hover { color: var(--ops-text); } + .ops-tab-active { + border-color: var(--ops-accent); + color: var(--ops-accent); + } + + .ops-code { + @apply font-mono text-[12.5px] leading-[1.45] outline-none; + background: #070b11; + color: #cbd5e1; + border-color: var(--ops-border); + } + html.light .ops-code { + background: #f8fafc; + color: #334155; + } + + .ops-panel { + background: var(--ops-surface); + border-color: var(--ops-border); + } + + .ops-chrome-header { + @apply flex shrink-0 items-center gap-1.5 border-b px-2.5; + height: var(--ops-toolbar-h); + border-color: var(--ops-border); + background: color-mix(in srgb, var(--ops-surface) 92%, #000); + } + html.light .ops-chrome-header { + background: var(--ops-surface); + } + + .ops-section-label { + @apply flex h-7 shrink-0 items-center px-2.5 text-[10px] font-semibold uppercase tracking-[0.06em]; + color: var(--ops-muted); + border-color: var(--ops-border); + background: var(--ops-surface-2); + } + + .ops-statusbar { + @apply flex shrink-0 items-center gap-2.5 border-t px-2.5; + font-size: var(--ops-font-xs); + height: var(--ops-statusbar-h); + border-color: var(--ops-border); + background: var(--ops-surface-2); + color: var(--ops-muted); + } + + .ops-tree-item { + @apply flex w-full items-center gap-1 truncate rounded px-1.5 text-left leading-tight transition; + min-height: var(--ops-row-h); + font-size: var(--ops-font-sm); + color: color-mix(in srgb, var(--ops-text) 78%, var(--ops-muted)); + } + .ops-tree-item:hover { + background: color-mix(in srgb, var(--ops-accent) 10%, transparent); + color: var(--ops-accent); + } + .ops-tree-item-active { + background: color-mix(in srgb, var(--ops-accent) 14%, transparent); + color: var(--ops-accent); + } + + .ops-grid { + @apply w-full border-collapse text-left text-[12px]; + } + .ops-grid th { + @apply sticky top-0 border-b px-1.5 py-[3px] font-semibold whitespace-nowrap; + border-color: var(--ops-border); + background: var(--ops-surface-2); + color: var(--ops-muted); + } + .ops-grid td { + @apply border-b px-1.5 py-[2px] font-mono whitespace-nowrap; + border-color: var(--ops-border-soft); + color: var(--ops-text); + } + .ops-grid tbody tr:nth-child(even) td { + background: var(--ops-row-alt); + } + .ops-grid tbody tr:hover td { + background: color-mix(in srgb, var(--ops-accent) 8%, transparent); + } + .ops-grid tbody tr.ops-row-selected td { + background: var(--ops-bg-active) !important; + } + .ops-grid th { + position: relative; + user-select: none; + } + .ops-grid th .ops-col-resize { + position: absolute; + right: 0; + top: 0; + width: 5px; + height: 100%; + cursor: col-resize; + } + .ops-grid th.ops-sortable { + cursor: pointer; + } + .ops-driver-row { + display: flex; + align-items: center; + gap: 10px; + width: 100%; + min-height: var(--ops-row-h); + padding: 0 10px; + border-bottom: 1px solid var(--ops-border-soft); + text-align: left; + background: transparent; + color: var(--ops-text); + font-size: var(--ops-font-sm); + transition: background 0.1s; + } + .ops-driver-row:hover { + background: var(--ops-bg-active); + } + .ops-driver-row .ops-driver-meta { + margin-left: auto; + font-size: var(--ops-font-xs); + color: var(--ops-muted); + } + .ops-tab-dirty::before { + content: "●"; + margin-right: 4px; + font-size: 8px; + color: var(--ops-accent); + } + .ops-grid .ops-null { + color: var(--ops-muted); + font-style: italic; + } + .ops-grid .ops-rownum { + @apply w-7 min-w-[1.75rem] text-right select-none; + color: var(--ops-muted); + background: var(--ops-surface-2) !important; + } + + .ops-modal { + @apply overflow-hidden rounded-lg border; + border-color: var(--ops-border); + background: var(--ops-surface); + color: var(--ops-text); + } + .ops-modal-header { + @apply border-b px-3.5 py-2 text-[13px] font-semibold; + border-color: var(--ops-border); + background: var(--ops-surface-2); + } + .ops-modal-body { + @apply px-3.5 py-2.5 text-[13px] leading-relaxed; + color: color-mix(in srgb, var(--ops-text) 90%, var(--ops-muted)); + } + .ops-modal-footer { + @apply flex justify-end gap-2 border-t px-3.5 py-2; + border-color: var(--ops-border); + } + + .ops-card { + @apply flex flex-col items-center gap-1.5 rounded-md border p-2.5 transition; + border-color: var(--ops-border); + background: color-mix(in srgb, var(--ops-surface-2) 80%, transparent); + } + .ops-card:hover { + border-color: color-mix(in srgb, var(--ops-accent) 55%, var(--ops-border)); + background: color-mix(in srgb, var(--ops-accent) 8%, var(--ops-surface-2)); + } + + details > summary .ops-tree-chevron { + display: inline-block; + transition: transform 0.12s ease; + } + details[open] > summary .ops-tree-chevron { + transform: rotate(90deg); + } +} + + + .ops-drop-line { + height: 2px; + margin: 1px 4px; + border-radius: 1px; + background: var(--ops-accent); + } + .ops-drop-slot { + border: 1px dashed var(--ops-border); + } + .ops-drop-slot-active { + border-color: var(--ops-accent); + background: color-mix(in srgb, var(--ops-accent) 12%, transparent); + } + + .ops-split-x { + width: 5px; + cursor: col-resize; + flex-shrink: 0; + background: transparent; + } + .ops-split-x:hover, + .ops-split-x:active { + background: color-mix(in srgb, var(--ops-accent) 45%, transparent); + } + .ops-split-y { + height: 5px; + cursor: row-resize; + flex-shrink: 0; + background: transparent; + } + .ops-split-y:hover, + .ops-split-y:active { + background: color-mix(in srgb, var(--ops-accent) 45%, transparent); + } + .cm-editor { + height: 100%; + outline: none; + background: transparent; + } + + .ops-close-faint { + display: inline-flex; + align-items: center; + justify-content: center; + width: 18px; + height: 18px; + border-radius: 3px; + font-size: 12px; + line-height: 1; + color: color-mix(in srgb, var(--ops-muted) 55%, transparent); + background: transparent; + } + .ops-close-faint:hover { + color: var(--ops-text); + background: color-mix(in srgb, var(--ops-muted) 18%, transparent); + } + .ops-ctx { + position: fixed; + z-index: 90; + min-width: 140px; + padding: 4px; + border-radius: 6px; + border: 1px solid var(--ops-border); + background: var(--ops-surface); + box-shadow: 0 8px 24px rgba(0,0,0,.35); + } + .ops-ctx button { + display: block; + width: 100%; + text-align: left; + padding: 6px 10px; + border-radius: 4px; + font-size: var(--ops-font-sm); + color: var(--ops-text); + background: transparent; + } + .ops-ctx button:hover { + background: var(--ops-bg-active); + } + .ops-tree-group { + font-size: 10px; + font-weight: 600; + letter-spacing: 0.04em; + color: var(--ops-muted); + } diff --git a/apps/web/src/styles.css.bak b/apps/web/src/styles.css.bak new file mode 100644 index 0000000..8cebfc3 --- /dev/null +++ b/apps/web/src/styles.css.bak @@ -0,0 +1,48 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { color-scheme: dark; } + html.light { color-scheme: light; } + * { scrollbar-color: #334155 transparent; scrollbar-width: thin; } + body { @apply m-0 bg-[#080d14] font-sans antialiased text-slate-200; } + html.light body { @apply bg-slate-50 text-slate-800; } + button, input, select, textarea { font: inherit; } +} + +@layer components { + .ops-input { + @apply rounded-md border border-slate-700 bg-slate-900 px-3 py-2 text-sm text-slate-200 outline-none transition placeholder:text-slate-600 focus:border-cyan-500 focus:ring-1 focus:ring-cyan-500/30; + } + html.light .ops-input { + @apply border-slate-300 bg-white text-slate-800 placeholder:text-slate-400; + } + .ops-btn-primary { + @apply rounded-md bg-cyan-600 px-4 py-2 text-sm font-semibold text-white shadow-sm transition hover:bg-cyan-500 disabled:cursor-not-allowed disabled:opacity-50; + } + .ops-btn-secondary { + @apply rounded-md border border-slate-700 bg-slate-900 px-3 py-1.5 text-sm text-slate-300 transition hover:border-slate-600 hover:bg-slate-800; + } + html.light .ops-btn-secondary { + @apply border-slate-300 bg-white text-slate-700 hover:bg-slate-100; + } + .ops-btn-ai { + @apply rounded-md border border-slate-700 bg-slate-900/80 px-2.5 py-1.5 text-xs font-medium text-slate-300 transition hover:border-cyan-600 hover:bg-cyan-950/40 hover:text-cyan-300; + } + .ops-tab { + @apply border-b-2 border-transparent px-4 py-3 text-xs font-medium text-slate-500 transition hover:text-slate-200; + } + .ops-tab-active { + @apply border-cyan-500 text-cyan-300; + } + .ops-code { + @apply rounded-md border border-slate-800 bg-[#070b11] p-3 font-mono text-xs leading-5 text-slate-300 outline-none focus:border-cyan-700; + } + .ops-panel { + @apply border-slate-800 bg-slate-950/80; + } + html.light .ops-panel { + @apply border-slate-200 bg-white; + } +} diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts new file mode 100644 index 0000000..6250766 --- /dev/null +++ b/apps/web/tailwind.config.ts @@ -0,0 +1,15 @@ +import type { Config } from "tailwindcss"; + +export default { + content: [ + "./index.html", + "./src/**/*.{ts,tsx}", + "../../packages/ui/src/**/*.{ts,tsx}", + ], + theme: { + extend: { + fontFamily: { mono: ["JetBrains Mono", "SFMono-Regular", "Menlo", "monospace"] }, + }, + }, + plugins: [], +} satisfies Config; diff --git a/apps/web/tsconfig.app.json b/apps/web/tsconfig.app.json new file mode 100644 index 0000000..7a3d8ce --- /dev/null +++ b/apps/web/tsconfig.app.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "noEmit": true, + "allowImportingTsExtensions": true, + "types": [ + "vite/client" + ] + }, + "include": [ + "src", + "../../packages/ui/src", + "../../packages/core/src", + "../../packages/transport/src" + ] +} diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json new file mode 100644 index 0000000..ea9d0cd --- /dev/null +++ b/apps/web/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/apps/web/tsconfig.node.json b/apps/web/tsconfig.node.json new file mode 100644 index 0000000..d8ff2ca --- /dev/null +++ b/apps/web/tsconfig.node.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "noEmit": true, + "composite": true, + "types": [ + "node" + ] + }, + "include": [ + "vite.config.ts" + ] +} diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts new file mode 100644 index 0000000..a698be4 --- /dev/null +++ b/apps/web/vite.config.ts @@ -0,0 +1,29 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import path from "node:path"; + +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + "@opsxdb/core": path.resolve(__dirname, "../../packages/core/src/index.ts"), + "@opsxdb/transport": path.resolve(__dirname, "../../packages/transport/src/index.ts"), + "@opsxdb/ui": path.resolve(__dirname, "../../packages/ui/src/index.ts"), + }, + }, + server: { + host: "127.0.0.1", + port: 5174, + strictPort: true, + proxy: { + "/api": { + target: "http://127.0.0.1:8788", + changeOrigin: true, + }, + "/health": { + target: "http://127.0.0.1:8788", + changeOrigin: true, + }, + }, + }, +}); diff --git a/connection-types/dameng.yaml b/connection-types/dameng.yaml new file mode 100644 index 0000000..f342de1 --- /dev/null +++ b/connection-types/dameng.yaml @@ -0,0 +1,39 @@ +schemaVersion: 1 +order: 260 +dbType: dameng +rustVariant: Dameng +label: 达梦 DM8 +dialect: Dameng +runtimeMode: agent +mcpMode: bridge +agentKey: dameng +driverStoreVisible: true +driverStoreOrder: 1 +singleConnectionPool: true +metadataConnectionScoped: false +skipTcpProbe: true +defaultPort: 5236 +traits: + schemaAware: true + singleDatabase: true + clearableQuerySchema: true + fetchFirst: true + diagramSql: true +supportLevel: operate +capabilities: + queryExecution: true + metadataBrowse: true + objectBrowser: true + objectSource: true + schemaSearch: true + diagram: true + tableDataEdit: true + tableStructureEdit: true + tableImport: true + dataTransfer: true + sqlFileExecution: true + databaseCreate: false + fieldLineage: true + sqlExplain: true + userAdmin: false + driverManagement: true diff --git a/connection-types/mongodb.yaml b/connection-types/mongodb.yaml new file mode 100644 index 0000000..6c9e7c4 --- /dev/null +++ b/connection-types/mongodb.yaml @@ -0,0 +1,37 @@ +schemaVersion: 1 +order: 110 +dbType: mongodb +rustVariant: MongoDb +label: MongoDB (Legacy) +runtimeMode: agent +mcpMode: bridge +agentKey: mongodb +driverStoreVisible: true +driverStoreOrder: 41 +driverProfiles: + - profile: mongodb-legacy + agentKey: mongodb + label: MongoDB (Legacy) + storeVisible: false +singleConnectionPool: true +metadataConnectionScoped: false +skipTcpProbe: true +defaultPort: 27017 +supportLevel: connect +capabilities: + queryExecution: true + metadataBrowse: false + objectBrowser: true + objectSource: false + schemaSearch: false + diagram: false + tableDataEdit: false + tableStructureEdit: false + tableImport: false + dataTransfer: true + sqlFileExecution: false + databaseCreate: false + fieldLineage: false + sqlExplain: false + userAdmin: false + driverManagement: false diff --git a/connection-types/mysql.yaml b/connection-types/mysql.yaml new file mode 100644 index 0000000..c1e69f8 --- /dev/null +++ b/connection-types/mysql.yaml @@ -0,0 +1,32 @@ +schemaVersion: 1 +order: 10 +dbType: mysql +rustVariant: Mysql +label: MySQL +dialect: MySQL +runtimeMode: native +mcpMode: direct +singleConnectionPool: false +metadataConnectionScoped: true +skipTcpProbe: false +defaultPort: 3306 +traits: + diagramSql: true +supportLevel: operate +capabilities: + queryExecution: true + metadataBrowse: true + objectBrowser: true + objectSource: true + schemaSearch: true + diagram: true + tableDataEdit: true + tableStructureEdit: true + tableImport: true + dataTransfer: true + sqlFileExecution: true + databaseCreate: true + fieldLineage: true + sqlExplain: true + userAdmin: true + driverManagement: false diff --git a/connection-types/oracle.yaml b/connection-types/oracle.yaml new file mode 100644 index 0000000..45d4fc7 --- /dev/null +++ b/connection-types/oracle.yaml @@ -0,0 +1,48 @@ +schemaVersion: 1 +order: 130 +dbType: oracle +rustVariant: Oracle +label: Oracle +dialect: Oracle +runtimeMode: agent +mcpMode: bridge +agentKey: oracle +driverStoreVisible: true +driverStoreOrder: 18 +driverProfiles: + - profile: oracle-legacy + agentKey: oracle + label: Oracle + storeVisible: false + - profile: oracle-10g + agentKey: oracle + label: Oracle + storeVisible: false +singleConnectionPool: true +metadataConnectionScoped: false +skipTcpProbe: true +defaultPort: 1521 +traits: + schemaAware: true + singleDatabase: true + clearableQuerySchema: true + fetchFirst: true + diagramSql: true +supportLevel: operate +capabilities: + queryExecution: true + metadataBrowse: true + objectBrowser: true + objectSource: true + schemaSearch: true + diagram: true + tableDataEdit: true + tableStructureEdit: true + tableImport: true + dataTransfer: true + sqlFileExecution: true + databaseCreate: false + fieldLineage: true + sqlExplain: true + userAdmin: false + driverManagement: true diff --git a/connection-types/postgres.yaml b/connection-types/postgres.yaml new file mode 100644 index 0000000..c48cab3 --- /dev/null +++ b/connection-types/postgres.yaml @@ -0,0 +1,36 @@ +schemaVersion: 1 +order: 20 +dbType: postgres +rustVariant: Postgres +label: PostgreSQL +dialect: PostgreSQL +runtimeMode: native +mcpMode: direct +singleConnectionPool: false +metadataConnectionScoped: false +skipTcpProbe: false +defaultPort: 5432 +traits: + schemaAware: true + treeSchema: true + pgVacuum: true + pgLikeStructure: true + diagramSql: true +supportLevel: operate +capabilities: + queryExecution: true + metadataBrowse: true + objectBrowser: true + objectSource: true + schemaSearch: true + diagram: true + tableDataEdit: true + tableStructureEdit: true + tableImport: true + dataTransfer: true + sqlFileExecution: true + databaseCreate: true + fieldLineage: true + sqlExplain: true + userAdmin: true + driverManagement: false diff --git a/connection-types/redis.yaml b/connection-types/redis.yaml new file mode 100644 index 0000000..4a58e0b --- /dev/null +++ b/connection-types/redis.yaml @@ -0,0 +1,29 @@ +schemaVersion: 1 +order: 70 +dbType: redis +rustVariant: Redis +label: Redis +runtimeMode: native +mcpMode: bridge +singleConnectionPool: false +metadataConnectionScoped: false +skipTcpProbe: false +defaultPort: 6379 +supportLevel: connect +capabilities: + queryExecution: true + metadataBrowse: false + objectBrowser: false + objectSource: false + schemaSearch: false + diagram: false + tableDataEdit: false + tableStructureEdit: false + tableImport: false + dataTransfer: false + sqlFileExecution: false + databaseCreate: false + fieldLineage: false + sqlExplain: false + userAdmin: false + driverManagement: false diff --git a/connection-types/sqlserver.yaml b/connection-types/sqlserver.yaml new file mode 100644 index 0000000..cdc3ff0 --- /dev/null +++ b/connection-types/sqlserver.yaml @@ -0,0 +1,41 @@ +schemaVersion: 1 +order: 100 +dbType: sqlserver +rustVariant: SqlServer +label: SQL Server +dialect: SQL Server +runtimeMode: native +mcpMode: bridge +driverProfiles: + - profile: sqlserver-legacy + agentKey: sqlserver-legacy + label: SQL Server legacy compatibility component + storeVisible: true + storeOrder: 47 +singleConnectionPool: false +metadataConnectionScoped: false +skipTcpProbe: false +defaultPort: 1433 +traits: + schemaAware: true + databaseSchemaQualified: true + treeSchema: true + diagramSql: true +supportLevel: operate +capabilities: + queryExecution: true + metadataBrowse: true + objectBrowser: true + objectSource: true + schemaSearch: true + diagram: true + tableDataEdit: true + tableStructureEdit: true + tableImport: true + dataTransfer: true + sqlFileExecution: true + databaseCreate: true + fieldLineage: true + sqlExplain: true + userAdmin: false + driverManagement: false diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..92cad05 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3355 @@ +{ + "name": "opsxdb", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "opsxdb", + "workspaces": [ + "apps/web", + "packages/*" + ], + "engines": { + "node": ">=20" + } + }, + "apps/web": { + "name": "@opsxdb/web", + "version": "0.1.0", + "dependencies": { + "@opsxdb/core": "*", + "@opsxdb/transport": "*", + "@opsxdb/ui": "*", + "@tauri-apps/api": "^2.5.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/node": "^22.20.3", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.4.1", + "autoprefixer": "^10.4.21", + "postcss": "^8.5.3", + "tailwindcss": "^3.4.17", + "typescript": "^5.8.2", + "vite": "^6.2.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.3.0.tgz", + "integrity": "sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.3", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", + "integrity": "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.11.1.tgz", + "integrity": "sha512-O/4hG3SC1YwcmQ0d2UVNDs+AsaNWd1iHVxbTeEBuqH+6bExAiPK3iS/BvpY6rZGURALv4ZD3sIgcCmRvw3ehBg==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.7.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-sql": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.10.0.tgz", + "integrity": "sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", + "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/state": { + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.5.tgz", + "integrity": "sha512-QjLbZmY1Au3JiRrDVYFLRD0BZ3SOKS9pR3yjIkd7u27YY8TFD9/Q9fhPnLV5l1mHFSo3hHU/N31vpwEJOx4owQ==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/theme-one-dark": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", + "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.43.12", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.12.tgz", + "integrity": "sha512-Nv0vxQ19NAqvB/c2pFzjIzFlzzJl7jmdtNkwOwGbn0Ks9mFAzibvumz7cQem5cRsFA2cEw2fg+uHZGbcHupLQQ==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.7.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lezer/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", + "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "license": "MIT" + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", + "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.4.tgz", + "integrity": "sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==", + "license": "MIT" + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opsxdb/core": { + "resolved": "packages/core", + "link": true + }, + "node_modules/@opsxdb/transport": { + "resolved": "packages/transport", + "link": true + }, + "node_modules/@opsxdb/ui": { + "resolved": "packages/ui", + "link": true + }, + "node_modules/@opsxdb/web": { + "resolved": "apps/web", + "link": true + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.3.tgz", + "integrity": "sha512-w3Jnvi1ocaVm/c7yVPpfB98XeSRBMyzp6njL5MVVbGyXjpmUkN+s6Hp4t0PqhGCCaI1ZHMKXt/w0lA1RCaLVcw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.3.tgz", + "integrity": "sha512-uI/ESiaIbbRYAEhzy8PCUWDp1hB0bjAqM06mW9flOoNO4Q8DQpeoREhBR5Hegfl+wpXiguyJv6XSPzEN7OxyHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.3.tgz", + "integrity": "sha512-oxhrd1jmXLwWZ83eQYDXxuqRdkqkzrjR3JobKeuUyfdNZo11FuQIvqEOZhyIT7OBHxXoGslDDjN0cQcM6T0TqQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.3.tgz", + "integrity": "sha512-7/YiIMghVE8DrxKvNdorAaJVdriOFgOIpdStnPx8ppx5zfTwC3jBCSEAIzB7JD5404m65THl6H93UTTVUvypmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.3.tgz", + "integrity": "sha512-GXFZRRoMAytaI5z6N3Zhfw0WL18Q0M8r95D5hlC4GqE/lGk8pbSJNUBoOWDfbm6dTciqHj2nU87tI5f6XhQiOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.3.tgz", + "integrity": "sha512-77W+8X3ddYgPxUpB8nZFQs2Mq+wc4HVlcSRtApXLjYBcnPMkttrSnU8VwKQjeWYhMsITHFs5cWBQ8vz1Q+5RHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.3.tgz", + "integrity": "sha512-FVkwK+iUC+mq+GipVK46rRVticfAPtvPUNlqlGXUDxdVk/UGjQiiiUVPUrEXdSpU2ufU0XxLGyTqDtBidDOVmg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.3.tgz", + "integrity": "sha512-+aGU1t3398yQOVj1Bz8o3e+KtswxAPvO+mtxtNdfXYMkXIHu7XhhkCD7/DEH9q8tF8uhDnMWvfpUKI8y1sZJsg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.3.tgz", + "integrity": "sha512-cR0kjpRXR2KJ2oQK8E2KTPtphs+b9hZ8IhTZubNryt/RsqgdOZBQ2Zq0q5UedtiIi0rs3jVhJh55RE1ZHUVGUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.3.tgz", + "integrity": "sha512-y1RYi4Q3/9ByVWSSt9kX2ustE0B7kFYbJ6zZdVZVyqopZs3yhCTwRfrjIX4vezUJInma/Gs6BOFDJg7yZmJ0IQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.3.tgz", + "integrity": "sha512-DNhEA5viIj3Z5bZLE4z4oV8N5ozWqDwyt7T6KG7VdLDJ0nW+rNOYlphBl4/3HQkK75qipPLsVOfStHHOwN9WSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.3.tgz", + "integrity": "sha512-17gQCqrIpXBX2Cmi9/TygnVOqGbzsba/iaqcYSL8FY7lNugg+7AiYNs5c5nKWD+NRQha36Sa0CqkJqH4XVHwnQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.3.tgz", + "integrity": "sha512-6LwVnZRIyINpdku/yOcI8Tm9YqLmhHK5emmlOOnW9tO0SYEm1FmKPcsSAGp0NBlqR2P04xaND4jvN6sTHqhq8A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.3.tgz", + "integrity": "sha512-xMUqkTXlEUtI/p5AAukMwBRr1enU3efsTeF+bskeFfk8t1C9rcC8sLREcZXmTfAXEbvRdJVSonVJez3TMlbR3w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.3.tgz", + "integrity": "sha512-S3E94co9F9WRRqEaUoQZ38K1gCz6KiM+nL7/3ijq7fDGF3OznjS5TasgYITlvl27GQKtu4lOAOsr5MFwkijvOA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.3.tgz", + "integrity": "sha512-1QtRDwG42x5BJI3s9mxu5rEjDnfbSnk20HQ9/ylTAYnSwYwxMVb+Vgu34wzzTQ7ogqBybebgQNUDAvZVQ38DbA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.3.tgz", + "integrity": "sha512-BQhejF6ZXOpxbngiNTP12GCGQeaDVL2QXGeBVViKIYzFHM5RKxTxwUMB1fr1BeNFphFMpnRqC5QSXFSa4z6UQw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.3.tgz", + "integrity": "sha512-SXagRwnI2Wlwlitllu59UK/nGVbD1CKPcNqDplHwIC4BqJcpXFjD32d1R/RbuISa95HdQrZM3/7v4bKiowFaLA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.3.tgz", + "integrity": "sha512-2IPozoEALRCziGqE8O9KMK60PMu5TS1huv4fwoeCexj+WjmcwFtX9CTOVbfXCUqcELAubEwRFPYlzb/WvwY2HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.3.tgz", + "integrity": "sha512-AoxqosUHT9IX54hFn2TiN6A7d6ZKTtE6pd2bqWtqkkNJ6HJGaU6FRouGX8L1O7R/ZwsnCnpQrHzb4pDEx+UHRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.3.tgz", + "integrity": "sha512-d+CaftKgmkFBzCwezMqqy1d0QNNYugqLCMcYVQWBy5SS2YfeMP8Q8ripkgx9O8IyBXXLHrJ+aaCV4U96usv6Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.3.tgz", + "integrity": "sha512-xXlDF6nR1eOuXbdDy5Hl5fmtY7teUDevF/k0O7IPoZe4Tpmdv+lgdE5JRsnhQtt37ql9P0VF2kAN9a0OCZdo+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.3.tgz", + "integrity": "sha512-YtXAgLN+JP7Ay6qG3eWhc7IHMQPzLc8r3uvhAvlJIoCz/4Q32+Bl9Fmnywidh8v1GOIMmymjovfqY9ETAtysvA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.3.tgz", + "integrity": "sha512-WuWtSJRNo549vzcfZyEgfqb6zeSgn1F+UE5kQ+BCjzz0W4MGCjntUHkZVc1VRuAM7+ULaSyhiPxD1spyewFvkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.3.tgz", + "integrity": "sha512-+lIKX7O0+IGe7WuhATaAMMeT7B76vfhXH/l9wLQL+nvyhbw2ohYCKIdWL56JfDu75CWt5oKRP4QFH/jkMtBquA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tauri-apps/api": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.11.1.tgz", + "integrity": "sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.20.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.3.tgz", + "integrity": "sha512-DZmzkmwHzXrLPAXPyKNDzlIwMMUZCVacoD25ywdy5YTKGbOx/2ld+Q38Im2zJ0vBuZP5Prd3VZutKZyXwkOS8A==", + "dev": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "devOptional": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", + "dev": true, + "peerDependencies": { + "@types/react": "^19.3.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.7.tgz", + "integrity": "sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==", + "dev": true, + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.7", + "@vitest/utils": "3.2.7", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.7.tgz", + "integrity": "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==", + "dev": true, + "dependencies": { + "@vitest/spy": "3.2.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz", + "integrity": "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==", + "dev": true, + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.7.tgz", + "integrity": "sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==", + "dev": true, + "dependencies": { + "@vitest/utils": "3.2.7", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.7.tgz", + "integrity": "sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "3.2.7", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.7.tgz", + "integrity": "sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==", + "dev": true, + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.7.tgz", + "integrity": "sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "3.2.7", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/autoprefixer": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.6.1.tgz", + "integrity": "sha512-cL1Qz6ADZhcEbny/8HPfe99J6HhNoYtpX2LFLIbhgGE7Q1hlQVkYFdetDN7Id3KiQxhDrHwzlHr/YQCnZ8+xSA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.28.9", + "caniuse-lite": "^1.0.30001810", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.24", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.24.tgz", + "integrity": "sha512-hYrgxie335U08WqICoGqKRzV1HFXv6zdxwJE4ekCb80CM9a0SVVsN4QPwT67RraRo+9h8IATk6uxHJw7QSkdOg==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.0.tgz", + "integrity": "sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.11.23", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.427", + "node-releases": "^2.0.55", + "update-browserslist-db": "^1.3.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/crelt": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", + "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==", + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", + "license": "MIT" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.430", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.430.tgz", + "integrity": "sha512-e1QEj72Y4zd8RlNZVmoTg+iCOSVwpk05IOiiQwdrkwCSVlZfPthevErhE+nckGd2YbsXfp1SkisznhGVIXP2NQ==", + "dev": true + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/moo": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.3.tgz", + "integrity": "sha512-m2fmM2dDm7GZQsY7KK2cme8agi+AAljILjQnof7p1ZMDe6dQ4bdnSMx0cPppudoeNv5hEFQirN6u+O4fDE0IWA==", + "license": "BSD-3-Clause" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "license": "MIT", + "dependencies": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "bin": { + "nearley-railroad": "bin/nearley-railroad.js", + "nearley-test": "bin/nearley-test.js", + "nearley-unparse": "bin/nearley-unparse.js", + "nearleyc": "bin/nearleyc.js" + }, + "funding": { + "type": "individual", + "url": "https://nearley.js.org/#give-to-nearley" + } + }, + "node_modules/nearley/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.55", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.55.tgz", + "integrity": "sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", + "license": "CC0-1.0" + }, + "node_modules/randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "license": "MIT", + "dependencies": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", + "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", + "dependencies": { + "scheduler": "^0.28.0" + }, + "peerDependencies": { + "react": "^19.3.0" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.2.tgz", + "integrity": "sha512-/peqiBB/n07gQGLsWaHho3WfvUyRscw0gYTsEFMhrIe/nWLkYaf5SbKYjGYqtRV3aPwykJgF2VEMo1ac4bnsGA==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.3.tgz", + "integrity": "sha512-1i2XreiAoMMXuPGD6Msj2xWrMMkHojNRKivInxGQcg7/1KuPuYlfUutLyh4drnOxUTHX9cHI4wFoat8D/NKaBw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.3", + "@rollup/rollup-android-arm64": "4.63.3", + "@rollup/rollup-darwin-arm64": "4.63.3", + "@rollup/rollup-darwin-x64": "4.63.3", + "@rollup/rollup-freebsd-arm64": "4.63.3", + "@rollup/rollup-freebsd-x64": "4.63.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.3", + "@rollup/rollup-linux-arm-musleabihf": "4.63.3", + "@rollup/rollup-linux-arm64-gnu": "4.63.3", + "@rollup/rollup-linux-arm64-musl": "4.63.3", + "@rollup/rollup-linux-loong64-gnu": "4.63.3", + "@rollup/rollup-linux-loong64-musl": "4.63.3", + "@rollup/rollup-linux-ppc64-gnu": "4.63.3", + "@rollup/rollup-linux-ppc64-musl": "4.63.3", + "@rollup/rollup-linux-riscv64-gnu": "4.63.3", + "@rollup/rollup-linux-riscv64-musl": "4.63.3", + "@rollup/rollup-linux-s390x-gnu": "4.63.3", + "@rollup/rollup-linux-x64-gnu": "4.63.3", + "@rollup/rollup-linux-x64-musl": "4.63.3", + "@rollup/rollup-openbsd-x64": "4.63.3", + "@rollup/rollup-openharmony-arm64": "4.63.3", + "@rollup/rollup-win32-arm64-msvc": "4.63.3", + "@rollup/rollup-win32-ia32-msvc": "4.63.3", + "@rollup/rollup-win32-x64-gnu": "4.63.3", + "@rollup/rollup-win32-x64-msvc": "4.63.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sql-formatter": { + "version": "15.8.2", + "resolved": "https://registry.npmjs.org/sql-formatter/-/sql-formatter-15.8.2.tgz", + "integrity": "sha512-kTYRg5FIcvsDtYUG2Qn9pYT6xKwiLJN5TTIvc5Mur6hIg4pSfdpHu8Yyu5bqESLHnVM3mXzD446cb2+uEaKZXg==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "nearley": "^2.20.1" + }, + "bin": { + "sql-formatter": "bin/sql-formatter-cli.cjs" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true + }, + "node_modules/style-mod": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.4.tgz", + "integrity": "sha512-XXWIQt633/EpAFx8aZDOTjBzrCaGmhvEQlQo6MVPfa2OzO2cWo+4hV9h+6UkHYlXGfy+ODXKUdP7Pthmcu5ATw==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.6.tgz", + "integrity": "sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.7.tgz", + "integrity": "sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==", + "dev": true, + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.7", + "@vitest/mocker": "3.2.7", + "@vitest/pretty-format": "^3.2.7", + "@vitest/runner": "3.2.7", + "@vitest/snapshot": "3.2.7", + "@vitest/spy": "3.2.7", + "@vitest/utils": "3.2.7", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.7", + "@vitest/ui": "3.2.7", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/zustand": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.15.tgz", + "integrity": "sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, + "packages/core": { + "name": "@opsxdb/core", + "version": "0.1.0", + "devDependencies": { + "typescript": "^5.8.2", + "vitest": "^3.0.9" + } + }, + "packages/transport": { + "name": "@opsxdb/transport", + "version": "0.1.0", + "dependencies": { + "@opsxdb/core": "*" + }, + "devDependencies": { + "typescript": "^5.8.2" + }, + "peerDependencies": { + "@tauri-apps/api": "^2.0.0" + }, + "peerDependenciesMeta": { + "@tauri-apps/api": { + "optional": true + } + } + }, + "packages/ui": { + "name": "@opsxdb/ui", + "version": "0.1.0", + "dependencies": { + "@codemirror/commands": "^6.11.1", + "@codemirror/lang-sql": "^6.10.0", + "@codemirror/language": "^6.12.4", + "@codemirror/state": "^6.7.5", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.43.12", + "@opsxdb/core": "*", + "@opsxdb/transport": "*", + "sql-formatter": "^15.8.2", + "zustand": "^5.0.3" + }, + "devDependencies": { + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "typescript": "^5.8.2" + }, + "peerDependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a877840 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "opsxdb", + "private": true, + "workspaces": [ + "apps/web", + "packages/*" + ], + "scripts": { + "dev:web": "npm run dev -w @opsxdb/web", + "build:web": "npm run build -w @opsxdb/web", + "test:core": "npm run test -w @opsxdb/core", + "dev:desktop": "npm --prefix apps/desktop run tauri -- dev", + "build:desktop": "npm --prefix apps/desktop run tauri -- build" + }, + "engines": { + "node": ">=20" + } +} diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 0000000..8f5adcf --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,19 @@ +{ + "name": "@opsxdb/core", + "version": "0.1.0", + "private": true, + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.ts", + "exports": { + ".": "./src/index.ts" + }, + "scripts": { + "test": "vitest run", + "test:watch": "vitest" + }, + "devDependencies": { + "typescript": "^5.8.2", + "vitest": "^3.0.9" + } +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 0000000..9849430 --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1,10 @@ +export type { + HttpMethod, + HttpSpec, + WsSpec, + HttpResult, + WsSession, + Transport, +} from "./types"; + +export { replaceVariables, replaceVariablesInSpec } from "./replaceVariables"; diff --git a/packages/core/src/replaceVariables.test.ts b/packages/core/src/replaceVariables.test.ts new file mode 100644 index 0000000..b27a932 --- /dev/null +++ b/packages/core/src/replaceVariables.test.ts @@ -0,0 +1,29 @@ +import { describe, expect, it } from "vitest"; +import { replaceVariables, replaceVariablesInSpec } from "./replaceVariables"; + +describe("replaceVariables", () => { + it("replaces Postman-style {{var}}", () => { + expect(replaceVariables("{{baseUrl}}/api", { baseUrl: "https://x.test" })).toBe( + "https://x.test/api", + ); + }); + + it("leaves unknown vars intact", () => { + expect(replaceVariables("hello {{missing}}", {})).toBe("hello {{missing}}"); + }); + + it("supports multiple and spaced keys", () => { + expect( + replaceVariables("{{ host }}/{{path}}", { host: "h", path: "p" }), + ).toBe("h/p"); + }); + + it("replaceVariablesInSpec walks nested strings", () => { + const out = replaceVariablesInSpec( + { url: "{{baseUrl}}/v1", headers: { Authorization: "Bearer {{token}}" } }, + { baseUrl: "http://a", token: "t" }, + ); + expect(out.url).toBe("http://a/v1"); + expect(out.headers.Authorization).toBe("Bearer t"); + }); +}); diff --git a/packages/core/src/replaceVariables.ts b/packages/core/src/replaceVariables.ts new file mode 100644 index 0000000..4ce99f5 --- /dev/null +++ b/packages/core/src/replaceVariables.ts @@ -0,0 +1,35 @@ +/** + * Postman-style {{var}} replacement. + * Unknown variables are left as-is. + */ +export function replaceVariables( + input: string, + env: Record, +): string { + if (!input) return input; + return input.replace(/\{\{\s*([a-zA-Z0-9_.-]+)\s*\}\}/g, (match, key: string) => { + if (Object.prototype.hasOwnProperty.call(env, key)) { + return env[key] ?? ""; + } + return match; + }); +} + +export function replaceVariablesInSpec>( + spec: T, + env: Record, +): T { + const walk = (v: unknown): unknown => { + if (typeof v === "string") return replaceVariables(v, env); + if (Array.isArray(v)) return v.map(walk); + if (v && typeof v === "object") { + const out: Record = {}; + for (const [k, val] of Object.entries(v as Record)) { + out[k] = walk(val); + } + return out; + } + return v; + }; + return walk(spec) as T; +} diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts new file mode 100644 index 0000000..e7f3ca9 --- /dev/null +++ b/packages/core/src/types.ts @@ -0,0 +1,39 @@ +export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE"; + +export type HttpSpec = { + method: HttpMethod; + url: string; + headers: Record; + query?: Record; + body?: { + mode: "none" | "json" | "raw" | "form" | "urlencoded"; + raw?: string; + }; + timeoutMs?: number; +}; + +export type WsSpec = { + url: string; + protocols?: string[]; + headers?: Record; +}; + +export type HttpResult = { + status: number; + headers: Record; + body: string; + timeMs: number; + size: number; +}; + +export interface WsSession { + onMessage(cb: (data: string) => void): void; + onStatus(cb: (s: string) => void): void; + send(data: string): void; + close(): void; +} + +export interface Transport { + http(spec: HttpSpec): Promise; + ws(spec: WsSpec): WsSession; +} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 0000000..a47cede --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": [ + "src" + ] +} diff --git a/packages/core/vitest.config.ts b/packages/core/vitest.config.ts new file mode 100644 index 0000000..f624398 --- /dev/null +++ b/packages/core/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + }, +}); diff --git a/packages/transport/package.json b/packages/transport/package.json new file mode 100644 index 0000000..b50a84b --- /dev/null +++ b/packages/transport/package.json @@ -0,0 +1,25 @@ +{ + "name": "@opsxdb/transport", + "version": "0.1.0", + "private": true, + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.ts", + "exports": { + ".": "./src/index.ts" + }, + "dependencies": { + "@opsxdb/core": "*" + }, + "devDependencies": { + "typescript": "^5.8.2" + }, + "peerDependencies": { + "@tauri-apps/api": "^2.0.0" + }, + "peerDependenciesMeta": { + "@tauri-apps/api": { + "optional": true + } + } +} diff --git a/packages/transport/src/browser.ts b/packages/transport/src/browser.ts new file mode 100644 index 0000000..2189ebd --- /dev/null +++ b/packages/transport/src/browser.ts @@ -0,0 +1,81 @@ +import type { HttpResult, HttpSpec, Transport, WsSession, WsSpec } from "@opsxdb/core"; + +function buildUrl(spec: HttpSpec): string { + const u = new URL(spec.url); + if (spec.query) { + for (const [k, v] of Object.entries(spec.query)) { + if (v !== undefined && v !== "") u.searchParams.set(k, v); + } + } + return u.toString(); +} + +function headersToRecord(h: Headers): Record { + const out: Record = {}; + h.forEach((v, k) => { + out[k] = v; + }); + return out; +} + +export const browserTransport: Transport = { + async http(spec: HttpSpec): Promise { + const started = performance.now(); + const init: RequestInit = { + method: spec.method, + headers: { ...spec.headers }, + signal: spec.timeoutMs + ? AbortSignal.timeout(spec.timeoutMs) + : undefined, + }; + if (spec.body && spec.body.mode !== "none" && spec.method !== "GET") { + init.body = spec.body.raw ?? ""; + if (spec.body.mode === "json" && !("content-type" in Object.fromEntries( + Object.entries(spec.headers).map(([k, v]) => [k.toLowerCase(), v]), + ))) { + (init.headers as Record)["Content-Type"] = "application/json"; + } + } + const res = await fetch(buildUrl(spec), init); + const body = await res.text(); + const timeMs = Math.round(performance.now() - started); + return { + status: res.status, + headers: headersToRecord(res.headers), + body, + timeMs, + size: new TextEncoder().encode(body).length, + }; + }, + + ws(spec: WsSpec): WsSession { + const socket = new WebSocket(spec.url, spec.protocols); + const messageCbs: Array<(data: string) => void> = []; + const statusCbs: Array<(s: string) => void> = []; + const emitStatus = (s: string) => statusCbs.forEach((cb) => cb(s)); + + emitStatus("connecting"); + socket.onopen = () => emitStatus("open"); + socket.onclose = () => emitStatus("closed"); + socket.onerror = () => emitStatus("error"); + socket.onmessage = (ev) => { + const data = typeof ev.data === "string" ? ev.data : String(ev.data); + messageCbs.forEach((cb) => cb(data)); + }; + + return { + onMessage(cb) { + messageCbs.push(cb); + }, + onStatus(cb) { + statusCbs.push(cb); + }, + send(data) { + socket.send(data); + }, + close() { + socket.close(); + }, + }; + }, +}; diff --git a/packages/transport/src/detect.ts b/packages/transport/src/detect.ts new file mode 100644 index 0000000..68e7be5 --- /dev/null +++ b/packages/transport/src/detect.ts @@ -0,0 +1,41 @@ +import type { Transport } from "@opsxdb/core"; +import { browserTransport } from "./browser"; +import { ginProxyTransport } from "./ginProxy"; +import { tauriNativeTransport } from "./tauriNative"; + +export type TransportKind = "tauri-native" | "gin-proxy" | "browser"; + +export type DetectOptions = { + ginBaseUrl?: string; + /** Force a transport regardless of environment */ + force?: TransportKind; +}; + +function isTauri(): boolean { + if (typeof window === "undefined") return false; + const w = window as unknown as { __TAURI_INTERNALS__?: unknown }; + return Boolean(w.__TAURI_INTERNALS__); +} + +export function detectTransport(opts: DetectOptions = {}): { + kind: TransportKind; + transport: Transport; +} { + if (opts.force === "browser") { + return { kind: "browser", transport: browserTransport }; + } + if (opts.force === "tauri-native") { + return { kind: "tauri-native", transport: tauriNativeTransport }; + } + if (opts.force === "gin-proxy") { + const base = opts.ginBaseUrl ?? "http://127.0.0.1:8788"; + return { kind: "gin-proxy", transport: ginProxyTransport(base) }; + } + + if (isTauri()) { + return { kind: "tauri-native", transport: tauriNativeTransport }; + } + + const base = opts.ginBaseUrl ?? "http://127.0.0.1:8788"; + return { kind: "gin-proxy", transport: ginProxyTransport(base) }; +} diff --git a/packages/transport/src/ginProxy.ts b/packages/transport/src/ginProxy.ts new file mode 100644 index 0000000..6ffb04c --- /dev/null +++ b/packages/transport/src/ginProxy.ts @@ -0,0 +1,35 @@ +import type { HttpResult, HttpSpec, Transport, WsSession, WsSpec } from "@opsxdb/core"; +import { browserTransport } from "./browser"; + +/** + * HTTP goes through Gin POST /v1/proxy/http. + * WS (MVP): falls back to browser WebSocket — custom headers require + * desktop/Gin tunnel later (Week 2). + */ +export function ginProxyTransport(baseUrl: string): Transport { + const root = baseUrl.replace(/\/$/, ""); + + return { + async http(spec: HttpSpec): Promise { + const res = await fetch(`${root}/v1/proxy/http`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(spec), + }); + if (!res.ok) { + const text = await res.text(); + throw new Error(`gin-proxy HTTP ${res.status}: ${text}`); + } + return (await res.json()) as HttpResult; + }, + + ws(spec: WsSpec): WsSession { + // TODO(week2): custom headers need desktop/Gin WS tunnel. + // For MVP, fall back to browser WebSocket (no custom headers). + console.warn( + "[opsxdb/transport] gin-proxy WS falls back to browser WebSocket; custom headers need desktop/Gin tunnel later", + ); + return browserTransport.ws(spec); + }, + }; +} diff --git a/packages/transport/src/index.ts b/packages/transport/src/index.ts new file mode 100644 index 0000000..f1b2e22 --- /dev/null +++ b/packages/transport/src/index.ts @@ -0,0 +1,5 @@ +export { browserTransport } from "./browser"; +export { ginProxyTransport } from "./ginProxy"; +export { tauriNativeTransport } from "./tauriNative"; +export { detectTransport } from "./detect"; +export type { TransportKind, DetectOptions } from "./detect"; diff --git a/packages/transport/src/tauriNative.ts b/packages/transport/src/tauriNative.ts new file mode 100644 index 0000000..29a7744 --- /dev/null +++ b/packages/transport/src/tauriNative.ts @@ -0,0 +1,68 @@ +import type { HttpResult, HttpSpec, Transport, WsSession, WsSpec } from "@opsxdb/core"; + +async function invoke(cmd: string, args?: Record): Promise { + try { + const { invoke: tauriInvoke } = await import("@tauri-apps/api/core"); + return await tauriInvoke(cmd, args); + } catch (e) { + const msg = e instanceof Error ? e.message : String(e); + throw new Error( + `tauri-native invoke("${cmd}") failed (are you running inside OpsxDB desktop?): ${msg}`, + ); + } +} + +export const tauriNativeTransport: Transport = { + async http(spec: HttpSpec): Promise { + return invoke("http_send", { spec }); + }, + + ws(spec: WsSpec): WsSession { + const messageCbs: Array<(data: string) => void> = []; + const statusCbs: Array<(s: string) => void> = []; + let sessionId: string | null = null; + + const emitStatus = (s: string) => statusCbs.forEach((cb) => cb(s)); + + void (async () => { + try { + emitStatus("connecting"); + sessionId = await invoke("ws_connect", { spec }); + emitStatus("open"); + // Full event listen pipeline is Week 2; stub keeps UI usable. + } catch (e) { + emitStatus("error"); + messageCbs.forEach((cb) => + cb(`[ws_connect error] ${e instanceof Error ? e.message : String(e)}`), + ); + } + })(); + + return { + onMessage(cb) { + messageCbs.push(cb); + }, + onStatus(cb) { + statusCbs.push(cb); + }, + send(data) { + if (!sessionId) { + messageCbs.forEach((cb) => cb("[ws] not connected")); + return; + } + void invoke("ws_send", { sessionId, data }).catch((e) => { + messageCbs.forEach((cb) => + cb(`[ws_send error] ${e instanceof Error ? e.message : String(e)}`), + ); + }); + }, + close() { + if (!sessionId) return; + void invoke("ws_close", { sessionId }).finally(() => { + sessionId = null; + emitStatus("closed"); + }); + }, + }; + }, +}; diff --git a/packages/transport/tsconfig.json b/packages/transport/tsconfig.json new file mode 100644 index 0000000..a47cede --- /dev/null +++ b/packages/transport/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": [ + "src" + ] +} diff --git a/packages/ui/package.json b/packages/ui/package.json new file mode 100644 index 0000000..7900fe2 --- /dev/null +++ b/packages/ui/package.json @@ -0,0 +1,32 @@ +{ + "name": "@opsxdb/ui", + "version": "0.1.0", + "private": true, + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.ts", + "exports": { + ".": "./src/index.ts" + }, + "dependencies": { + "@codemirror/commands": "^6.11.1", + "@codemirror/lang-sql": "^6.10.0", + "@codemirror/language": "^6.12.4", + "@codemirror/state": "^6.7.5", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.43.12", + "@opsxdb/core": "*", + "@opsxdb/transport": "*", + "sql-formatter": "^15.8.2", + "zustand": "^5.0.3" + }, + "peerDependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "typescript": "^5.8.2" + } +} diff --git a/packages/ui/src/AiPanel.tsx b/packages/ui/src/AiPanel.tsx new file mode 100644 index 0000000..44e2c21 --- /dev/null +++ b/packages/ui/src/AiPanel.tsx @@ -0,0 +1,185 @@ +import { callAi, type AiAction } from "./api"; +import { driverById } from "./catalog"; +import { useWorkspaceStore } from "./store"; + +const ACTIONS: { id: AiAction; label: string }[] = [ + { id: "generate", label: "生成" }, + { id: "explain", label: "解释" }, + { id: "optimize", label: "优化" }, + { id: "fix", label: "修复" }, + { id: "dialect", label: "方言" }, + { id: "sample", label: "样例" }, +]; + +export function AiPanel() { + const messages = useWorkspaceStore((s) => s.aiMessages); + const ask = useWorkspaceStore((s) => s.aiAsk); + const model = useWorkspaceStore((s) => s.aiModel); + const busy = useWorkspaceStore((s) => s.aiBusy); + const connections = useWorkspaceStore((s) => s.connections); + const activeConnectionId = useWorkspaceStore((s) => s.activeConnectionId); + const tabs = useWorkspaceStore((s) => s.tabs); + const activeTabId = useWorkspaceStore((s) => s.activeTabId); + const result = useWorkspaceStore((s) => s.result); + const set = useWorkspaceStore((s) => s.set); + const pushAi = useWorkspaceStore((s) => s.pushAi); + const updateActiveSql = useWorkspaceStore((s) => s.updateActiveSql); + + const conn = connections.find((c) => c.id === activeConnectionId); + const tab = tabs.find((t) => t.id === activeTabId); + const sql = tab?.sql ?? ""; + + const run = async (action: AiAction, prompt?: string) => { + const text = (prompt ?? ask).trim(); + if (action === "ask" && !text) return; + set("aiBusy", true); + if (action === "ask" || action === "generate") { + pushAi("user", text || ACTIONS.find((a) => a.id === action)?.label || action); + } else { + pushAi("user", `${ACTIONS.find((a) => a.id === action)?.label || action}`); + } + try { + const res = await callAi({ + action, + prompt: text, + sql, + driver: conn?.driver, + database: conn?.database || tab?.database, + error: result?.error, + }); + pushAi("assistant", res.content); + if (res.sql) updateActiveSql(res.sql); + if (action === "ask" || action === "generate") set("aiAsk", ""); + } catch (e) { + pushAi("assistant", `失败:${e instanceof Error ? e.message : String(e)}`); + } finally { + set("aiBusy", false); + } + }; + + return ( + + ); +} diff --git a/packages/ui/src/ConnectionForm.tsx b/packages/ui/src/ConnectionForm.tsx new file mode 100644 index 0000000..b90504e --- /dev/null +++ b/packages/ui/src/ConnectionForm.tsx @@ -0,0 +1,561 @@ +import { useState, type ReactNode } from "react"; +import { formKindOf, type DriverDef } from "./catalog"; +import type { SavedConnection } from "./store"; + +const COLORS = ["#3b82f6", "#22c55e", "#f59e0b", "#ef4444", "#8b5cf6", "#64748b"]; + +type TabId = "general" | "advanced" | "ssl" | "ssh"; + +const TABS: { id: TabId; label: string }[] = [ + { id: "general", label: "常规" }, + { id: "advanced", label: "高级" }, + { id: "ssl", label: "SSL" }, + { id: "ssh", label: "SSH" }, +]; + +function cx(...xs: Array) { + return xs.filter(Boolean).join(" "); +} + +function Row({ label, children }: { label: string; children: ReactNode }) { + return ( +
+
+ {label} +
+
{children}
+
+ ); +} + +function PasswordInput({ + value, + placeholder, + onChange, +}: { + value: string; + placeholder?: string; + onChange: (v: string) => void; +}) { + const [show, setShow] = useState(false); + return ( +
+ onChange(e.target.value)} + autoComplete="off" + /> + +
+ ); +} + +export type ConnectionFormProps = { + selected: DriverDef; + form: Partial; + setForm: (next: Partial) => void; + dsn: string; + setDsn: (v: string) => void; + onApplyDsn: () => void; +}; + +export function ConnectionForm({ selected, form, setForm, dsn, setDsn, onApplyDsn }: ConnectionFormProps) { + const [tab, setTab] = useState("general"); + const kind = formKindOf(selected.id); + const patch = (p: Partial) => setForm({ ...form, ...p }); + + const text = (key: keyof SavedConnection, ph = "") => ( + patch({ [key]: e.target.value } as Partial)} + /> + ); + + const portInput = ( + patch({ port: Number(e.target.value) || 0 })} + /> + ); + + const general = () => { + if (kind === "file") { + return ( + <> + {text("name", "我的数据库")} + + patch({ database: e.target.value })} + /> + + + ); + } + + if (kind === "redis") { + return ( + <> + {text("name", "Redis 连接")} + {text("host", selected.hints?.host ?? "127.0.0.1")} + {portInput} + + patch({ password: v })} + /> + + {text("user", "ACL ≥6 可选")} + + patch({ keySeparator: e.target.value || ":" })} + /> + + +
+ + + + + Sentinel / Cluster 本迭代未做 + +
+
+ + ); + } + + if (kind === "oracle") { + const idKind = form.oracleIdKind ?? "service"; + return ( + <> + {text("name", "Oracle 连接")} + + + + {text("host", selected.hints?.host ?? "127.0.0.1")} + {portInput} + +
+ + +
+
+ + patch({ service: e.target.value, database: e.target.value })} + /> + + + + + {text("user", selected.hints?.user ?? "system")} + + patch({ password: v })} /> + + + + + + ); + } + + // standard (mysql-like) + PG / SQL Server extras + const isPg = selected.id === "postgresql" || selected.id === "gaussdb" || selected.id === "kingbase"; + const isMssql = selected.id === "sqlserver"; + return ( + <> + {text("name", "我的数据库")} + {text("host", selected.hints?.host ?? "127.0.0.1")} + {portInput} + {text("user", selected.hints?.user ?? "root")} + + patch({ password: v })} /> + + + + + {(isPg || isMssql || selected.id === "mysql" || selected.mysqlCompat) && ( + + patch({ database: e.target.value })} + /> + + )} + {isMssql && ( + + + + )} + + ); + }; + + const advanced = () => ( + <> + + + + +
+ {COLORS.map((c) => ( +
+
+ {kind === "redis" && ( + + { + const v = e.target.value.trim(); + if (v === "") { + patch({ database: "" }); + return; + } + if (!/^\d{1,2}$/.test(v)) return; + const n = Number(v); + if (n >= 0 && n <= 15) patch({ database: v }); + }} + /> + + )} + {kind !== "file" && ( + +
+ setDsn(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") onApplyDsn(); + }} + /> + +
+
+ )} + + ); + + const sslOn = !!(form.ssl || (form.sslMode && form.sslMode !== "disable")); + const sslMode = (form.sslMode && form.sslMode !== "disable" ? form.sslMode : "require") as + | "require" + | "skip-verify" + | "verify-ca"; + + const ssl = () => ( + <> + + + + {kind === "file" ? ( +

+ 文件库(SQLite)不支持 SSL。 +

+ ) : sslOn ? ( + <> + + + + + patch({ sslCA: e.target.value })} + /> + + + patch({ sslCert: e.target.value })} + /> + + + patch({ sslKey: e.target.value })} + /> + +

+ {sslMode === "require" + ? "仅加密传输;路径可留空。verify-ca 需填 CA。" + : sslMode === "skip-verify" + ? "加密且不校验服务端证书(自签常用);路径可留空。" + : "校验服务端证书链;请填写 CA 证书路径。客户端证书/密钥可选。"} +

+ + ) : ( +

+ 开启后可选择 require / skip-verify / verify-ca,并可选填证书路径。 +

+ )} + + ); + + const ssh = () => ( + <> + + + + {form.sshEnabled && ( + <> + + patch({ sshHost: e.target.value })} + /> + + + patch({ sshPort: Number(e.target.value) || 22 })} + /> + + + patch({ sshUser: e.target.value })} + /> + + + + + {(form.sshAuth ?? "password") === "password" ? ( + + patch({ sshPassword: v })} + /> + + ) : ( + <> + +

e@C|X0`hSJ>w}N%&^3?zU002ovPDHLk FV1j0wy+Hr~ literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7351eb12326aa014aa53fa62a1c2576c8ba7c82d GIT binary patch literal 4175 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 Ze*};n8Z+Bx7ux^;002ovPDHLkV1hAO;++5h literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1be910b8d2a846895fec71623156ff1d7dd4e47d GIT binary patch literal 8940 zcmV1^@s67{VYS001JhNkl`UG3&mM){N`yQpx6Hilk-iPFNbP-hq;P)` z(Ge7wIDXJ`Jt_cm`2krP*`2rDOYN6mOOY?WCab=lqgAB>6;h@-#dB;`u1H4O?}LwN*>BFL-WOjZtFD&p>S}V4yG^7j`p9N+eeCr1 zlG`1k>K(SBaTlIJmFumof`*k_&73{J62fHXt@lvt*}o^JyPE<{O$Jyc476x_JK1%0 z)N)GEhlws7{s7Zo zAoAtcwD6!GGfDbC3bb%aDY)YD89|mFVEPlIOP11t zy$+>*X5Rx%jeLVN;3{j7aaj~??~snbl)v0dfeGV$L6*8w)2zJ9H;F}uA0zD@11@tE zMHLY&^#A97jEz~$pYQ z8h>!dwKr4uqfc-M9B*naa|VNqF#&7q5u|&W~jk*E)Bmuj~486xMJ(^iRQLw zPP$Ad3YsWQo^v-eTAz>J+# z*z@W9^Boj^{VheL8WPnU%1puoE4^Hgb>4Jm5|-jA5{Tn)2hG;}>HCt?)~;B36TQsI zHdS&>W{+#8segNnwPq8@!<3yAy>7psB42&Oa+@jxE^~59mC*cwkng!9v?9%ji+ooWM_V@@s@W6S_Mz!0$H)nc}E#`$zV_!#wn`ne#{L@#rO8pVL2?gt)= zsV;0!MArS-TqSFE47ki0;(^|uG1NV0uD(&)ss`(O|0ACId7rG>8lyxtXBYr;1VerA zzAu8*Sdkx^`yA_ix`r+AH^&@c2v`E9nPW~q4#wY@ z*^hkkDFuc5!c3f72JH;n9xSXhQF{cU7>Pwh|NlPc8jL5g)i2&H>7i0gL}AV^1~LYh z&CD|i_h+b?{Qu5*mgBQ8DF_k2&=YP6gA4PU%T1yBpC8R8AM1#Ee$>E>h zs;eQdqhU_I>M)+?Xl*0ws|~huoh8dkQ#}E2g+cpas+E zMxK<%a)f2oHY;9jH`JrjMyY`dKcsHJPWaR10xt0(^K6XxViR0xMVffWb*yKqR{~38 zBbC1hCNJ(D23WX6f3f@nI&9)mGkrT5vBIE&kjb7m8P{F_Sp}Q2jl1kTaxfiZ0G8Jm zxEl_WO(otN1Gv=BYo!<@RU`0q`|e3iT%S4Yx`??ybMp8)Fa7D4{>-*Td|>W@Xcuj3 zH$7PcupGj4S15~GP2C_TTz@GAr%vW!((qu;%p3!-lo2fC0nDeqV%?GqlQNYt{_2b6 z2Bb9Q1|SAt8KRTp0nEzmxq!jZnw__!=3oDU`7!2j0;V1_0Lv7?di%2f;DDlQnod5B zYQML;Sgo6)-vBIqLkvyVzCK^?gp`xYsK>6kSSSo9vAtxD0a#MQm3{c(5R^5*yjvxw zO1q_*CR}%^ifW!WsW}E)?Kra;kOwfV+0?%dPJY3~@ajkf_ab& zXIECnwSrbr&wv2*HkkJdzn~?%99uv zWpRM5#gb^!bAJ^P8QxsAJ8efb+i%6q`bO&e_kXGT{>Lb~V39QV3q|8*eX+s@ZYfJf ztcC_!?xn|*3^~#&0Mh)MG|D+WVpYzPV^5I_z=%tGJOwViX}A%O7YYQDl^d;3wfpQ& zwY%>m+c*+WbkP!8eDn!C(eq}(fGk+@x}<1Cy82mD6selxvJb#vpZNWiP?2ql#Q8Db zwxS8LZaiklUEu6ovF7RwsGS*DGbB}03dy(2|Bn~Z#9ObS`8(|^gFMpAA7dF-$pg%l zMNhrHQA%!_oQAB*%Jh*;55a8~y6>gFfrL01X*IV$hm()3a9MvB*liDu1hAcQhN1_H`BPM#&X)*?|G#}%1by3GP zH&F{y5-O6VXf0_0BMNLZ#TU#tST>Z&xZh9)mSc65lU!HrxDC}Yr~oc|T+0AZ>CZ`X z(Xce&D%M@AU=+%wAHlE}F&)4(itxmS9)D7N6`D``1zQnCQd1HE#gA32$|A+f&!fdh z9Zz;eL-qqRDe5YV_W)IGv5BNVq`}}yDZtquzICt`nIaB+GcZQ*WgoEQI1}z;t>AUd({1xr^#-pFNh(QU|9?x z^k-I7;K_!kLiFqTwB%=}(&UG4ix0yLj0X6#1|RCN`MVxKQC=r)@y<*y3Sm?ZLnc_Y zQoF-0x~|$jzOFdSx+)j9XPnlvF5&?e=KXMCF*L>K94FM1@iKt1HC1SjlV$d;=UqlE zzddEpviqcwIEWNk0gDxPi@txfq(4EoOau< zzL9!gePd)O6az4yC!jl&IfB7_Pp^x{?XCT)8>mW1%^5MGHLXaIZ+y+Cogjm}^#{+S z+C6s_LNuRsm9Oa=KMuIrv|qt%_OMeb8a1t=(d5D+qNyk#-u}8&#Iw%F^2pXx!tSm1we3tPd1S|~&z^H%#W|xB#M|Kgc z7Ie6JQUNrsVbDNc%&nmqxYF@TUYZ5C@UdR)gU`tpTzVx-EYew-VgzN!lVthy?hxxfYsjs|dlTzcBMG50>dC=x5Sa|M+rXw;G$c$_+X zY4F_>rBfpe1lun9gEDd{K!1(009c%+NXxaxS~2c`2w`*UrSqn{sO#>BV$(;N(p5$o z5rE*OPYp-_rR&ZIzr9!#6jW7NkoFH{P~=<6cOsh<>9vUlL<(?9 z%TE6tRc^437^!5t5IvbRL*A@R8$NW8Dj z;Ou?lZ3@kPl6szfk@`RTLT$vr@-bFFw48s2G`iE>Ts>k2sHAKpy~3`=DKMIUsmPGA(2eu$;@Oa>a~|Z54ft10IdT@D4H9Vjqy{IK*@n8tyY9efn(AxUqe(Q@I(3RgvWQKXArjsjQzzy2%A z*+NrF6eqw^)>So}_BK#;)gHTuCO)b7r6EXR@b$Hh3a9gydwgk%y#07cjofDh-&M2A z4*p#MD?us2gDDuWB?GV_PUuUDNUp1bY~Wk#)m58rm|PsYnjsJ5m;$9?tqXMxuGVud zpeEXa&UQU!{x0>5BjpWgD@Q@v3j-(la*TkjFZUzD(s;`8wj7EWE&sp_ilOr=_O zeU`dvJJeO_^i_c&_5rOpU&TCC=Z$wz&&#hXHNr?sjJ1_P%h{(Y`a<^<(<&vt{+8M< zzKS1PebH_r366PP6$W3`OtrgB7vi#JSJYJ#hOb*sjB;K99npQjIot<)?nU9NP=DDY z9l5kN4E;k`rq}JixB7k=+^nImk1kxyU~DeR=r#HP1F*vV{EP0Ex~h^}F135@DiUM3 z3Ff1&O6mjZD2Lu(h$n4&o_vn~|KBn`rueGH_~(rDi;7b}UN|kkJKg_dJ*5PzB%qck zWTix50SrSDyvrF*&J9N&A<=3i>M9SA*tXik%zEhYr+G2vJhnROjQ0WSYBQ6d`QAFh z(R%#(zY%IBZ9B-(N(oldww`;bno@F$dr4Pt)WC(cE*z~UTy>#(RgOem#m(fN7hYj0 z4EF(Fd0pIQU;rY~Dn%b~G=KK$tu~bgd2CoDts2pii6$)SDs-hpVE_!jV7@t3thG8# zy!mQzixCw5~d2d5Vz40N{_~+w_-~0O8LZtS-`VY~q3-85GvRwO7U<)PU zj@}ceFFL_#%hS|nA5rN%-Ncao`^cAH%Lp58pvAoIdgLRRRC<`o>0&MUD^$t1N&KQ? z!0?;{6V#$PHN`!7jZP&f^ec1^v*EA@6q~B>EfSnr_d|~>#f1S_hBSdud`?}k+6Dm{`Qj@{Ur2Q#^z*g~U#BHb@mCpqKJJKkk9W0h&-+v^ZL|k^b4udKcWHahVAzV{L zF-xmkE7w_*ALlX(zw*ZD^h%4~#yn;p*`wse{Hm^4btN`q+fsUvSltq%84}arPz*#; zvHS_A|I^R8+5I|e=sA@#IV(UD0~BY3U9VLSa_W;0GB>!IzmnBb%e?0Ab|Ce0i%YD@ zi%hOFHa__YQ$J!W3C$O$s{jw2q7a5o3J!qq-b&eL%+`5kAW80~uG{+F|A>~JcqY$1 zei&~fjbPIom!3+Nbx)mpe|nQUijS%F{qsY$1R~)@YEooYkwx9|M9+>C%JxGr{s=w( zl++$z=&>#ZMR5SEe5`I8AXm;Nm0AN*sh5iRu>__}raBfghUUx_#lwj1BtkvLH^ct_ zd?NG(_JsRcbs~)hr%sU+iQkJ|Upq8c>#_papva9$~)af?mPEif=u}j|IYj zex@zL`~tM=il-hc+*LA(b(i+K2ZshARII%^-wwB7P5$=Gg{>d=M)jdDGEyG=@p$qU z?tQ2pUmFGLg6mMsRD!zjH67M}k4wq7JMYKCyo4cH0Armd%|lu z<)YA)-Qf502iH^XI^=5QcKS+_~uG zo??_4e2Gk4D@yGod%(4V7r%W(K<=HQ*q{2$!*S+5C3WG*$D;)XeoWGNFi^1RvUpNt zE~!+MuC|IE8Ys|=)pDIC+W&#Yw2mTji{vyL`TQ&Y2~>r`b$RWV6&L%Izu_(j9LmQ~Heja2R}0v0`;Ib{3^IxU+RDiPf$_<_V$Q zFXV=JX>VKeQU|}nMQPz{2Ar^v0pRg7tJAe#3r8-go6rRSz!H7JG%0MiG)apJZ%C(5 zRlqj0=fzhA^s)+>zaG3XFs0sg*Ml;y2YHjPKR-vZI$qm{hCXH|3sqiS7K<3VV&Jpz)^y5o)c?t6GMfpGFZ}jA zv48>y;m?nck&U)GC8pb7Iqssfq`!$p47m6dnozMUT&C45g+)>B3S@N5!3?4wz-02L zLY~-|<&q!Y<~d1wv`2!J8|fN@AQSJnj;208Tej6U{Pc%1r@8niC#nley8Yl*e4jX0 z*$Bv^&d{V!24MNoF2e^kV^NBUCxFOG?JI$=(RkdC)W}^VN4M#L1H>NK^g3jW@{Q*` zl;3&#IcnzU=nb&=_BA;zLU`GH#z{(wl)Y$NoBZYGCwOsNj5U&{@OM`Ci{vFxYQ<~++EfgshOuva>qg~_! zU>%)tO_`f|YAMj%oJ?HmvHuEAS1qUeyAdW1&w`(V^e3JMt>oQA`R1+gnE7ji4r%07 z&!9i70!Wp?a*1HVmNUSlNiJ5KZpx+UR-=;bBmsb*IC$8L7}3X#P=+-=`%-Rz(6NDL zkaiXClSD%vzFOn)-i5*&qw3N}w0 z$6vRFjaC+NzjCab;lc8$@s(OaxFy&&r2&X|TCf-p>CItT5Srw&TG`L2S2OO|mKK`( zoN#H1-LHr(eh08Ys$xq=J4cm@HCB_TR?X3^YLg9_;H@9*G&Gc11b~*oira4W_FJ)c z|MR2gJ6qOFzHUyV4il|^nj0F@prk@v_Zbu|=bf%JW|`awxxw9f!4+E4>Yqh7`;hp&MEdetBUF6&O)X)1UyY6{dl&w`8 zarBwaie1Qzc#d>%-9}lZQt)~Z?8yo7!Il2aJ}UEF;TIr-@J4UaA9ah zYD!b&kCIOp|DxTlEEE;|gg2jcvf4W9=jRm+$Y89v5!MXDjW98lLRsOhqT#}hf3YH%@#aUx|~`l z!Kw<_Tgix90jOQe4q&3c%5YMx=}VOwLp)N~b?>9X{^tc;=~AgzxABcs*}A(TO!QVN zi}+CceZZJcZ7gXl2)%x=oSNMNFtF>HYBj$eptsVPFAFH_hwIij^K0On&Mg?5pbB69_px6+u|eXLZ@xPIB3a#OVG zeq{R)0jASn+eLp6H=bhhhcEye&2|y@B2g6kIzFdKjbYw%)N#Y@CF5al0G9W5k)=#j z(D2SNH6mIqLuy3Z$fU;{2Jf>OkuMdd0x6Qgs47+=|?aW=}3|3`jM$pV^BE^c5tf({8F*4G#<0QuXv!<0ASTJ$y_%5NNB=(da_TA z1QFr+a(m3#(y6Qim@8ceJK$|zwaVv}<#co<^%GP6f^?+n_~T6?6fDMl*<;!@!4L|! z&}?y=amH4ZHma{I21&f(?WVW5WK{wzE88x+R{DA-HRd{m8s!;;X=FnJ;-;BoF3AYS z^g>qs$e6yqv#2+1jM)M(#uTg(Y$ztBVe7bM)9{Y6yxFT0Qt9gfu+Bf<$?IrdQmOdH_D_$AcxMEkbJQo9-GOStZH%Uhoo*0CX|Hq0O0801rWKaY8dfr0PcJWn)k{D{1 zU@XB29J>H)2-ko#=+#RfVCw3OR?o6CE{H2YwcOaMtdQxSCCB|r<{Al+-K56cEgCS5 z#ZKVBmN5C)s)1K;SuoVF)a1z2`RChd(IH2RnJ(O=qw^Q?B8Dev!S08Msj!%!nAAu^ z+YcJyjV+rgym1}k!f6lQq=jbvGva+oR(^^_DoO-Mc^G6e%UFO$ZpD@_ksQ!k=D1Fm6-39vpJ;F7gDUK*&Ixu;SY zlv5)&s`nKka*OY&HYPD=$mtOns@r$Z*zeckQ7%^sGj_+rmWv1vkD}N$#jQCxx8b;s z4=y)Z>_BCrNg|jw%&?mqsh*d1x@-_)l~XNdPJZwOApv8j{_un1<8ru}qsaHBXkg7f zfBL@SC}Wu`x;eQ-FHVgZpPTx^Y1x81!*&D$R;Ev_%7a;mjjtC0zh|bTg`Djur?+ zIdWC=BCyG`?^HISY1Tof23W!@ApEZu?Dc($@Zu&>b{dcwaPjbR#p=A<@(H$2;C-2X z=E%0cnQT-{&L%&23k6x72-KQ%S>|bxF;KDEDm3|ln=^td^Wd#6`hzPjPg9<_SFWPb z#Y^KFDs#%_wkVN{pL?MrIC23KnZT9ZWOq=33?%H7$L^FyCW^bnu`Y9{q+T2HboN?`ut6>M;(*na2_>VeqGA&Zik_=CECS5nDl1X*uYOMT zhaE_2+A2Dv zvx99Ff~!oUh9eG?B^2WOFUup`AunGYI>1uYW&m2(y^m1$?75OcWeGbp?i|%b{$nSs z(eu8o0p7?1De1i$--Emc(TeyzR@`7wSKZ7#sQ%FX6|e?msv&=SHy_R?-m>$A!msbW z4=BWY6T@%5D6vV!iwd*WyE&IN>l6 zp4#Jy`s?5ijTCtABMN@?H3dHVl7frArO>J-viyFsI{2%rOFd4X>>k4)qpXaK3LhCh zA9?C($-DkoD&1rw@@}{;m2R~KdDj{h{g_Zl9!I8`nU|DyaN-5y#o|Tt0ob};dz<_V zU!ktI-=}T{WN5`Ivbwv~KQS4+UJw6wBkFPbZoLs z4XJF~t;o0g&Q!MJwgTp!#~~1zc?wQMN&w3SSJxZwP{*TBQRg!+Q1|CwGDrhN{6os8 zv&73lmDJ!LtjW?w7342h*ffK20`)zvOKYXPr zk`5f4_NUEB-<{9DNNsn_;XfC0n(mYoVU+t67{gZ251>!sfmX7cdLOM$zm#G|MLCs^ z-<_&|dp!B}*fnnU%ndm4B5Y71Wj9Z|j{FN=CX2yp4yjUM9>5K2Fb=w7+GSWMOyRcG zWH1hVd+b8B7oJU}+x%n=d}I%tu4ox5B+8F0G7bn}ea)N<3bKMh{pRSSK;`vPxT8bLxtepP(9l2r zpE?*Z5TEqfb;#YN}Mfs+r0sji=#v&E_;e zM75~Ao-~5fe!}45?`hewr%~YjkH}MB%e_h+E%iwrMKNSS6Mw|qTgki5+9?AxDL9>o z+5PcnwDic6Db%=BJ^?z7>(i$+&zB|7sF5`CzB{R8^GzbS>OVN`8X@@YceLbyqbamx znY4&BF!kvdK)L1Q88w0$9=VsiW5*<|LCu7>aKajfvHbF4{!tggnnEq zctR~Iz)WyoF?;P}nyP`m?1a-Pz$sm)a(&VQP{tAP1YF5*#=bbE4o(}*O_yCwe(q&@ z>V|4y>XSBr0#E)0FEYMnM&T`a&1u&G9gjUt%a5Nz2F8%ORiqE4ztv=M4LW?zEmSdi zpSbmBG&qGHWiX{}B{hyeghI<#3Ij!hQ=g20lUYul;lpV3^AC~9tw{%e@zc5u!j_pg z$_*WJQVmRfC_`j)v%Fkz);x1|-1OcPIqlhJ*K2Rll7o*UqqJ00+w`GqQ1PrlH#Iyw zm&$h7CTa$6#*$2%uf9nUgEK_E*GHc<(tDtbxf(Y{lbj>q3@H}7f8ne0B{NXXF489( zhj9j)rGMee2%Si9>=#%Z#&g0CsJLZxbkEWC31MhxFolh?y zv#L@@O?|Q-JsEeM&nyreIs+inx%9L@^aO=hx2H^J(np`P9?&rvf50KxZA}x6Ps`sW z{7fvP>DG}xl%v)X@Q3Uz7jnj>)SUiT-jIEA*^<=DX!_&?oR;9P`_nH3kC6)z=I2%* zpf5uDp_zs!Wgn=z8Y^Zn~G~rn^3rYsC@Z5O@@D2ESfR!7mpnX%P)heR2)X zGEVKEe?{G2eobZ;_s9UAr+@Wh1J<9qEr#0D}QPsPG$JY zA~RlnvK=t6RQWx5k>4Gyn_`QY5Qr$m!-7fF9pn?s8I~N^%|uIh3T28 zyBS#xApTBJ=B(nQXVp|w=})&%SdF7NA)sY|mTa&t)n9uBg_#%=AsOnEwOPAaboC6< zHiJ)gq>{*|0LT>wO`@7V{Du`On$+Lvlf3|1bT>g0tm|%RA*Iv<TRYJX;rUt*v(gq505-fFaK$9W@`F?dJ;|$k)cqs;vB6FmhY>-ak^^E z$1MNrqrsWRWvZYna#|_L_u(#3sll1%Bf#npg9&}op*7r~pQU7@ zHQi8yGwqSHql5a*Wa9d>Z2PUL_KFKc>s&`q4bI$0PIrTz>((JB9Ya;e9$q*N`T}!i zHj9;()$hpZzF6_8zxGP;dIXb+^6>@_AmVkQOTqi#Ao<9qEqqDyoG(zkk#lv&z>P^k zOlDFt2qFe#e3(R%7g5Opq{kE>BC_KG=pDN@m9k$th6&-8HvYT(Rul9V?`_>rX<^cH z{aL!%##BG^5?X%hxlAenLD|af$_al+q!#A?Ub6mJ+ZTNjm2rdzcNHZ~=hH7x^HtZ1 z@tMK)kolF?Lcv%j%SS09Z?SrXMCKPy#^M#t5qbo+Tb<-}Q zWk>x+r}aEZ==}aLjn!c#B>`XX`ya_Wx*>6G=J?BVnjg;n&&GWZmy3sJ0i=sB>j2U& zNdQXJyQN!fO68L$P{scHP$}E?Md|xHep0a)HGVFKG6+DIa9Ps**%zGh%kwIFdW#U7 zDsnor_1?hgSl>w2(cjPy3b4koP96KfUXX6@v2e6MwH5_5!;R;?C@8;5u^O@v4s8bJyrP(n;I#qGa-J7=Mp;ez=i$ z3ywvZ)}`l%$O+ISX`YL%BLCYJQ_iJPkKac|Wkr$Ww_)lnUV;2z;y1%i^U`8Ldgm?7_J7ZlUSai=Unj0V0Ul}Tj1&gb(xXo9 zDIFYe#nzGQaviz%II7^ZUAEHz>PSj$$q(x$U2na|;G8Qr{d`<~_7*2L?RpOK&dL65 zd0Av#7;L1bE3c)}t+yoKE;WDv_)R8P4P&sig z0c1JqNPuLZb!1A48Xn0YO&3j*-+?itGB2ffiZ^n0cc-*RWFm6n*6q}%TobPR-5*7e z0hgUb^{3%6BLrpCpR4cT$8cN9x0_u@?z9O2>FB4a?|bPf9ZAp z8S3)Z5xS_;de0tFyxV$DT6e@3gv-gJzHS!W1wcpq>&_m(@OZa$pK*!YU&b zJh>^|aBWE}T z@`p$vqULlvf200nL;IHNZl=yBpNll$ldgCGkai>;5Fnj;)RX$#hx!+fX}kMhZ0oZi zZ!bX_oUxHJQSg8|h$mizF{Bnndr6o*(tr;qr?K_t#vP6UBtH-Mqv#&sdq;qqNEnOL zdGLouj`lY&@uQ+3{HBUGa^lSn1d^@?%hqLC9D8rP;oOr9En7h=PCGZEE19-587K84 zI>Wql)zm-J58LiV?TyYJ z;q(ZnWdNpb`o$_D_4i`q^fY5yNP&+(qmDBoJKO zku%wnn|(u1N+p9_UxklWoqxGVE0(OkZbE`cR13*v!(M3+(Z3VIp$U>Kt>(|l@btyIW5=y zd1`W&zWu#B*{Tm3_ekf31kBf`M0G-+`5WzWV^ zUPBz2aG5A$!batR6RDi*Ht(3VB2g*fQzcPBUL%4s@Z0A-PMz$=?Av7rsr5oDSINaD z)VNeBDOb~^9kWxG~hwkyPRJ~+YY=0|pQsXZHR zlw(JxV!yqaA32dqx7s}A&B{pN<#bDZBv(j!W>9oI@oWT4C=a6Q$P`*S=(Bs%m^~XPZ}6Mr9Xp2kk-JmnLClZbc?V_L9o0)rUGYK$ z6Z$%8L<9p-8GGzx`!|NIzKslFHi_CGVR?7)R43 zdlUk(qwvAmTOG-sl~P9@Fj3WF>EuV+q64@H`TzHd%(Er6XNxR>bk5VOl1(<0TGPEa zM+ruhZGXR)Wo8zri&n7k9p}6SRY!7EjMS04>=1p6mb5*9J)4-hHl7=H-z(3YYQL83 z+J0O1h|+Yd4U?qv;CDY#^NiUdH8WV;j=gzbM-I2^NEQ$%-)nc_QKoIr#R76NAk@(t$Q}^xwgliYjZ=~|H8{W*PbtF9CK}q5VHzQj8q|2$o<#a%g#@( z<>WAqm~Dib>zMgZ_2dQk%*91IEwI#$lUenn>?|3l4sEW zlii@mTpKrid#0UjN8_Q_oh_Y*ggwo$%{XH1&891^Q7g<=mc~kly)nu%S4T23)$RNJkEsK5?fK7A_a~pJ^;j@}dYfx!0jV zwy^v>O_yIoK_-h78sjKG!3kjUI1xMBHRqnrqr`pF){jh7M`E1;VC;D0DGI#vzFe}v zZv-ff%F5gTGHPvv>uav3aS4i|L{S395wn<9-*bOKk0|p8oT5wKCEAfAANYr2*JQGe z}^k9_GhxiFx75cW^hTs!v{LDal8zdBlMv{PanaczpV3mU{ua^CElymzqz z#+d?4Nv9YqrsEgvt|MQ0Q!X~0&%QvxZ@yFicPu|LpDqrZqS3m7Hc~`yJ_!N3>B?(_ zb|>A7L39bq4LA)Yo>j8p`Ycklx6Sq`NsGXLnA=VeKka<>f4thTz~)E#RfNP1Hdl3I zA1-SErx7EM9p94M6hcWCt96L}r$wYAXBwogp~DVG2Wc#)!+F zwEY~=92))1e`)lqPf`7>%azC$e;B}YM=d8hN6zIa9}S{xkq4~$Cf%dAEe_!zH+1Tm z>gV$e&JAzl+c8^NS-X+ipZZZx|A*82ddbNQeU+GTo$jx`k-0efmjNdE2ASlGe<$)X z(8_e8O+JYWaP2tq!MjCDJL&Jn{+X8@d#bd>2Ge9H`{1OWULHns!)~4#S#21N znq~L?-1?VJ=Y^*|e&#o#^@65*@Z0Ydu>-9nG_MhPa(#2R8}Rth;=?Nn%84?Jy(otc zMB{`*DYSe=e1X~mKAy8`MqZZ9U2#ONz`GwvU(dJuPD)Y30j4Ni*zLW(0@aA|c63d5 zP~*bL3b$c2xIsY^A}%w3@TOuvhZl>~1w$rCMo#wVA-4!mpb*!d73`3a5S&s9gyd&K z`>Fl@hZPZK5Y?X91*Zd0zNL5a92-h)kbDLxJj3f1I7|nqVHFAc8&Tarja-V*-h(F9}AVntWLEOTe8u5BC1+GVH}n1uuZgEMC^L)KhvTW)F#mqLHczn7=92SXvj0&6?2H<86$Lom6gmFo zi(o%`lN>!UZwD(0UOPT!xqC(qPcSbZAW+>>Ffry>ogCR)Z}}Tb!~Ceo#@Pa>y$TG5 zf5W5qrYxWU{%PZ+!-=2)WiPtvv_9Y{hK9V7T|vqZH#bw@?e}HByMyUqhz8(yO8*jb zc=v_J9U=N$ry9{9cj{FBJCH!iw)-hn9(sTpeKMKX$d)=A>QBxlh~(GwaL?$|(BMZy zA0HOTR4>`@2>IU;neA-#Ke_Z7ao?TtGbfz6yKe9+PCs9S9SWVPl%L@24X7gc+NqQ^ zxF#)uU(X)9@*6i!94?~ic41Xl#%LgWE!%F z24^3EiuZ!wIHR&$NdqojEAa)@FV!_iv=5}fau3Ms{j{(Kr9`=?rk zPV~B+=filDz0^C{RG|>Zn}Y|O{kc%NeI=7zG9c!<^sry`O&!?&u!LJzi%9_NUQi1| zEJ3VRAXkG(?5sE^0xH@|TuYX+mr=u$_xDVLj3nbtE(v73$=advm;#ERgA<&oT&TEJ zB*F~5-B~^5q#n@4zS;Jh9C-gDT5`bAeI~kC{8jbKUr_Z)$1pfY%G3)bi2vo+x!M1s ztc;{eN)Z*16|4es>IqbL^<_z;z8KH)?H=>Ei_8r&q z#k6&f)?uBaEB=&@&yAu8#>(j+t@Ao?`NX~C3w0_uu}NhTU8io=Wz>Z(0dE9kRSQac zU-l6I;S|7WxwPSXdm{}~>cHAd&KG4oN#~}S-V(&od2)O)VUED{r`xe3>7c^4q!DXE zr)8C=6{t#px0F%c3|>!?lxWRZ>Pc8CUuQ-Q|5~D2M4Pv zL(lu2l6cHh)ey7DajDjo9dIUzAW_<&ZlG{q5|@{{D=$cWQ`Fg=a>O3`n_BxZuQ%+j zK+QQ*xHQ<4LRd}7Lx7sa9yJA=&8?|{v$l54opL-LhFC0*?HS#WIGsCfDIQ&R@Q%9J zOFM#P&SM;)X7VQOn$_3eaFu+p(EiG|^j`Fl)9@$}tyIA28Co5!cz{)Bek>G-ha7)o zYDTGiTCTZS=JbusxmIkz(oYi2IdhxmB zU2kmS8Mh-_$Y5@|aGKq}R2QkpB@5zQJY)ASe1%%ByF~=gaA|=KzHFnq>s|MfpJ67J z=1x)4r{)j86{A?8^_lrGJu3RhDPmtt=0LyD19Q~gu_+67qKs$jX@YuJeaZB= zS-TYq_AaMmU)qH}=d7c!*hBjR56k!zz{VI8Vh|_+N;lsm2B_iw?M~stfqkPq(v{a~ z-BitUD^ai0evf5!nQ3g`U)D{(NDN;c&SWy9)TXI_R#doD89}brlBh9*=ZUA}DDPkJ zlIT8(6b+j^V76X9em5%JW-GOlvPPY1q|`wGsfD~Hc{6j@k<$hz9Mh7?4x|t?4sLjhP7H1LG*t zL8YXPZ`^IXvkuB0BB`YRaXV4T#v8_ctpFyddCg)MQx*}q(BRA$;a03pG&Lo?(ISP{ zUVM(y&x|8s6Yrw2iqknRTcZ7xi587J{ew9LNk`lC3(>IS(I-`#ig)~dtQ-QcVm$@_ z4*v#qYzs5wF^Ev$)HP?`X|iL+oU{Vq+ccO!$r|=f9ol;P|A{D=r@mJHE-N*(^8w)Q zK~$THC4Kx0UlY4)xS5zdP{4#L_(P*|s`KTawxNwbh)|3|Yu#MXcP+H=oP zT^(stVUXa^DxLMbwn z5=JKYo^uV?bk+4z$K_+HByIIlV9X?;&9w|Xa*FTy47D~q)^@ zKhilrNBe&s5%2TC=6kNenbQ%bT28}wvCrsqe9u=7Uf=WFfzvefZ^0R1rg~#v!}pxi z`4zK7vc@dWuPI9*6LL(W%vbckOvCnokAO4PTG5e5od2BddtQ^BW;+f3p$Kqk8Wp}C zzn@}eCc$=Q_3FMo4r>}LZ`gFn^z3^U4Q351#-quiz^2I@KC9T%5Wvao900VhGwtT9 zt`$QAvqHCy(q})f2#i%ksa_Tk+Y2V zqalR{&R@}{C=}peg!2+w1gx=jXV{9kVt_!b>+}rOo2=U}mu1~ls$B>Ee&J;*?Rlk)OypM_Uv4zbIQb;Hn;Rjx82Hd&$BGFM3x?Q zqOhflIvSwgi4Q5?7R&e9OV(|@Yp*5D@s0-{=g9i1+9h|0y82{5qrZbj{^uXO@3gZ5 zCkPLXdmkcx-A1v`hVASjvWW1JWa=9Liz3~qs_K!F(I+GPhLVlfr%}(&6J-^z^9Det zG4R31;w4$seNQV!C>G{bmGMoh^hv++3Kj@O@`vku(}@%?Trv?Ef||HMPTR=Q${dKe zt3H$}C)Q+drOJc$>tQ8H!Oy>V@r0bPhe~I8D#NVLAUz<^FzygF#U95oh;TQZhn#Y} z3aPr-*C)%R6mU1>XWUg$#^T@b2q`C0reR0R z8g^I^MKfJv=|fo>fbePya2Lx6Gh;n!prSkExWi=|(a;21eJHa-58!Ob@kdbE_FJoq zr%S3)`kZSxOh`e5&{0$$%2Z#IN9K@)9JPQ&aqH{Wkoqy>5j`P1RX5XiSkOnG zOdTe9)Xlt90W%Jf#*9~>io?R>eW?2MlVs%;f=~MBleToucml3~uZqbNdeu3NPU~@$ z)RrE69CfnHbG|#w>Qgv%CIrr4XESo%oP^4K@xkeG%0PwP7 zsa}477vQGh(R)Rko)X#P^jXNu>rp12?C=GE`gYrqLd#aDkep7#dwpmy^)W^FlyTzQ zZ6|7Y?4Oc>C1QF#=~bC?OgtgN&@gW<)tq@MvzFUse_N+{ecYR@zyojrR(s9aQ>fvg zIguLE@TSh$=>4`%3HG+_XxaJn0$O#!mF&~FNZc8m9;rT5v?LC^|LE|PY_x$4azMk3 z#ZBhGNiI!sn^Dqo-L2Gi*IWwoCq?{r9ItSFiU*XIlJkMw_>hy1<%oG&kM~kveK-dM zPNFp&%&_9oJpBgQTtrRG&VzFBgIyNrV~ zCW_)sRxw( zjF#yIr@Iz)nSOS?`3|+udxHE7QfzgK0Vv#W;S`1ol>3E8UV^1J8*?qo6R}8+d4ITD zBY?EuM=xt^l}{K)l?U&y=x%Ob&NOv!(g#krQ?6kf)8qBBVzB>}HzlG5-u+O0l!(wgd&8x3|?5b`Ak_XQ8P483Dn ss)&W&ylan^=DBy>b>drOXDFcjKXtl#%WRi{rvLx|07*qoM6N<$g71eF(f|Me literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs new file mode 100644 index 0000000..b3d004e --- /dev/null +++ b/apps/desktop/src-tauri/src/lib.rs @@ -0,0 +1,150 @@ +mod sidecar; + +use tauri::Manager; + +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::time::{Duration, Instant}; + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct BodySpec { + mode: String, + raw: Option, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct HttpSpec { + method: String, + url: String, + #[serde(default)] + headers: HashMap, + query: Option>, + body: Option, + timeout_ms: Option, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +struct HttpResult { + status: u16, + headers: HashMap, + body: String, + time_ms: u128, + size: usize, +} + +#[derive(Debug, Deserialize)] +struct WsSpec { + url: String, + protocols: Option>, + headers: Option>, +} + +fn validate_http_url(raw: &str) -> Result { + let parsed = url::Url::parse(raw).map_err(|e| format!("invalid URL: {e}"))?; + match parsed.scheme() { + "http" | "https" => {} + _ => return Err("only http/https schemes are allowed".into()), + } + match parsed.host_str().unwrap_or("").to_ascii_lowercase().as_str() { + "169.254.169.254" | "metadata.google.internal" => { + return Err("blocked metadata host".into()) + } + _ => {} + } + Ok(parsed) +} + +#[tauri::command] +async fn http_send(spec: HttpSpec) -> Result { + let mut url = validate_http_url(&spec.url)?; + if let Some(query) = &spec.query { + let mut pairs = url.query_pairs_mut(); + for (key, value) in query { + pairs.append_pair(key, value); + } + } + + let method = reqwest::Method::from_bytes(spec.method.as_bytes()) + .map_err(|e| format!("invalid method: {e}"))?; + let timeout = Duration::from_millis(spec.timeout_ms.unwrap_or(30_000)); + let client = reqwest::Client::builder() + .timeout(timeout) + .build() + .map_err(|e| e.to_string())?; + let mut request = client.request(method, url); + for (key, value) in spec.headers { + request = request.header(&key, &value); + } + if let Some(body) = spec.body { + if body.mode != "none" { + request = request.body(body.raw.unwrap_or_default()); + } + } + + let started = Instant::now(); + let response = request.send().await.map_err(|e| e.to_string())?; + let status = response.status().as_u16(); + let headers = response + .headers() + .iter() + .map(|(k, v)| (k.to_string(), v.to_str().unwrap_or("").to_string())) + .collect(); + let bytes = response.bytes().await.map_err(|e| e.to_string())?; + let size = bytes.len(); + let body = String::from_utf8_lossy(&bytes).into_owned(); + Ok(HttpResult { + status, + headers, + body, + time_ms: started.elapsed().as_millis(), + size, + }) +} + +#[tauri::command] +async fn ws_connect(spec: WsSpec) -> Result { + let _ = (&spec.protocols, &spec.headers); + // TODO(week2): hold WebSocket sessions in managed state and emit messages. + Err(format!( + "WebSocket native tunnel is not implemented yet for {} (use browser WS in MVP)", + spec.url + )) +} + +#[tauri::command] +async fn ws_send(session_id: String, data: String) -> Result<(), String> { + let _ = (session_id, data); + Err("WebSocket native send is a Week 2 stub".into()) +} + +#[tauri::command] +async fn ws_close(session_id: String) -> Result<(), String> { + let _ = session_id; + Ok(()) +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .manage(sidecar::SidecarState::default()) + .setup(|app| { + let state = app.state::(); + sidecar::ensure_backend(app.handle(), &state); + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + http_send, + ws_connect, + ws_send, + ws_close + ]) + .build(tauri::generate_context!()) + .expect("error while building OpsxDB desktop") + .run(|app, event| { + let state = app.state::(); + sidecar::on_run_event(app, &event, &state); + }); +} diff --git a/apps/desktop/src-tauri/src/main.rs b/apps/desktop/src-tauri/src/main.rs new file mode 100644 index 0000000..a5f036e --- /dev/null +++ b/apps/desktop/src-tauri/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + opsxdb_desktop_lib::run(); +} diff --git a/apps/desktop/src-tauri/src/sidecar.rs b/apps/desktop/src-tauri/src/sidecar.rs new file mode 100644 index 0000000..2d182a8 --- /dev/null +++ b/apps/desktop/src-tauri/src/sidecar.rs @@ -0,0 +1,108 @@ +//! 桌面启动时拉起本机 OpsxDB Gin 后端(默认 127.0.0.1:8788)。 +use std::path::PathBuf; +use std::process::{Child, Command, Stdio}; +use std::sync::Mutex; +use std::thread; +use std::time::Duration; +use tauri::{AppHandle, Manager, RunEvent}; + +const HEALTH: &str = "http://127.0.0.1:8788/health"; +const ADDR: &str = "127.0.0.1:8788"; + +pub struct SidecarState { + child: Mutex>, +} + +impl Default for SidecarState { + fn default() -> Self { + Self { + child: Mutex::new(None), + } + } +} + +fn health_ok() -> bool { + ureq_get(HEALTH).is_ok() +} + +/// 轻量 GET,避免再引 reqwest 阻塞;用 std 即可。 +fn ureq_get(url: &str) -> Result<(), ()> { + let Ok(resp) = reqwest::blocking::Client::builder() + .timeout(Duration::from_secs(1)) + .build() + .and_then(|c| c.get(url).send()) + else { + return Err(()); + }; + if resp.status().is_success() { + Ok(()) + } else { + Err(()) + } +} + +fn candidate_bins(app: &AppHandle) -> Vec { + let mut out = Vec::new(); + // 打包资源:externalBin → 与可执行文件同级的 binaries 或 resource + if let Ok(dir) = app.path().resource_dir() { + out.push(dir.join("opsxdb-server")); + out.push(dir.join("binaries").join("opsxdb-server")); + } + if let Ok(exe) = app.path().executable_dir() { + out.push(exe.join("opsxdb-server")); + out.push(exe.join("binaries").join("opsxdb-server")); + } + // 开发态:仓库 apps/server/bin + out.push(PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../server/bin/opsxdb-server")); + out.push(PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../../apps/server/bin/opsxdb-server")); + out +} + +fn spawn_server(bin: &PathBuf) -> std::io::Result { + Command::new(bin) + .env("OPSXDB_ADDR", ADDR) + .env("GIN_MODE", "release") + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .spawn() +} + +pub fn ensure_backend(app: &AppHandle, state: &SidecarState) { + if health_ok() { + return; + } + for bin in candidate_bins(app) { + if !bin.exists() { + continue; + } + match spawn_server(&bin) { + Ok(child) => { + *state.child.lock().unwrap() = Some(child); + for _ in 0..30 { + if health_ok() { + return; + } + thread::sleep(Duration::from_millis(100)); + } + return; + } + Err(_) => continue, + } + } +} + +pub fn stop_backend(state: &SidecarState) { + if let Ok(mut g) = state.child.lock() { + if let Some(mut child) = g.take() { + let _ = child.kill(); + let _ = child.wait(); + } + } +} + +pub fn on_run_event(app: &AppHandle, event: &RunEvent, state: &SidecarState) { + if matches!(event, RunEvent::Exit | RunEvent::ExitRequested { .. }) { + stop_backend(state); + let _ = app; + } +} diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json new file mode 100644 index 0000000..f870da9 --- /dev/null +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "OpsxDB", + "version": "0.1.0", + "identifier": "com.opsx.db", + "build": { + "beforeDevCommand": "bash -lc 'curl -fsS http://127.0.0.1:5174 >/dev/null 2>&1 || npm --prefix ../.. run dev:web'", + "devUrl": "http://127.0.0.1:5174", + "beforeBuildCommand": "bash -lc 'cd ../.. && VITE_OPSXDB_API=http://127.0.0.1:8788 npm run build:web'", + "frontendDist": "../../web/dist" + }, + "app": { + "windows": [ + { + "title": "OpsxDB", + "width": 1280, + "height": 800, + "minWidth": 960, + "minHeight": 640, + "resizable": true, + "fullscreen": false, + "label": "main" + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "externalBin": [ + "binaries/opsxdb-server" + ] + } +} diff --git a/apps/server/cmd/opsxdb/main.go b/apps/server/cmd/opsxdb/main.go new file mode 100644 index 0000000..4b2c887 --- /dev/null +++ b/apps/server/cmd/opsxdb/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "log" + "os" + "strings" + + "opsxdb/server/internal/server" +) + +func main() { + addr := resolveListenAddr() + log.Printf("OpsxDB server listening on %s", addr) + if err := server.NewRouter().Run(addr); err != nil { + log.Fatal(err) + } +} + +// resolveListenAddr:默认仅本机 127.0.0.1:8788(桌面 sidecar 同机访问)。 +// 显式对外:OPSXDB_BIND_PUBLIC=1 或 OPSXDB_ADDR=:8788 / 0.0.0.0:8788。 +func resolveListenAddr() string { + if v := strings.TrimSpace(os.Getenv("OPSXDB_ADDR")); v != "" { + return v + } + pub := strings.ToLower(strings.TrimSpace(os.Getenv("OPSXDB_BIND_PUBLIC"))) + if pub == "1" || pub == "true" || pub == "yes" { + return ":8788" + } + return "127.0.0.1:8788" +} diff --git a/apps/server/config.example.yaml b/apps/server/config.example.yaml new file mode 100644 index 0000000..be69e9f --- /dev/null +++ b/apps/server/config.example.yaml @@ -0,0 +1,7 @@ +server: + addr: ":8788" +proxy: + timeout_ms: 30000 +# Environment overrides: +# OPSXDB_ADDR=:8788 +# OPSXDB_PROXY_TIMEOUT_MS=30000 diff --git a/apps/server/go.mod b/apps/server/go.mod new file mode 100644 index 0000000..7c13c1d --- /dev/null +++ b/apps/server/go.mod @@ -0,0 +1,63 @@ +module opsxdb/server + +go 1.25.0 + +require ( + github.com/gin-gonic/gin v1.10.0 + github.com/go-sql-driver/mysql v1.8.1 + github.com/jackc/pgx/v5 v5.7.2 + github.com/microsoft/go-mssqldb v1.8.0 + github.com/redis/go-redis/v9 v9.7.0 + github.com/sijms/go-ora/v2 v2.8.22 + golang.org/x/crypto v0.48.0 + modernc.org/sqlite v1.34.5 +) + +require ( + filippo.io/edwards25519 v1.1.0 // indirect + github.com/alicebob/miniredis/v2 v2.39.0 // indirect + github.com/bytedance/gopkg v0.1.3 // indirect + github.com/bytedance/sonic v1.15.0 // indirect + github.com/bytedance/sonic/loader v0.5.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cloudwego/base64x v0.1.6 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/gabriel-vasile/mimetype v1.4.12 // indirect + github.com/gin-contrib/sse v1.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.30.1 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.3.1 // indirect + github.com/yuin/gopher-lua v1.1.1 // indirect + golang.org/x/arch v0.22.0 // indirect + golang.org/x/net v0.51.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.41.0 // indirect + golang.org/x/text v0.34.0 // indirect + google.golang.org/protobuf v1.36.10 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + modernc.org/libc v1.55.3 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.8.0 // indirect +) diff --git a/apps/server/go.sum b/apps/server/go.sum new file mode 100644 index 0000000..c02743e --- /dev/null +++ b/apps/server/go.sum @@ -0,0 +1,185 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/alicebob/miniredis/v2 v2.39.0 h1:M7WbmV5BmV56L8KTG0rw6vEQ+woTOghpDgin2xv4A0g= +github.com/alicebob/miniredis/v2 v2.39.0/go.mod h1:TcL7YfarKPGDAthEtl5NBeHZfeUQj6OXMm/+iu5cLMM= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= +github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE= +github.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k= +github.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE= +github.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw= +github.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= +github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= +github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w= +github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= +github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/microsoft/go-mssqldb v1.8.0 h1:7cyZ/AT7ycDsEoWPIXibd+aVKFtteUNhDGf3aobP+tw= +github.com/microsoft/go-mssqldb v1.8.0/go.mod h1:6znkekS3T2vp0waiMhen4GPU1BiAsrP+iXHcE7a7rFo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= +github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/sijms/go-ora/v2 v2.8.22 h1:3ABgRzVKxS439cEgSLjFKutIwOyhnyi4oOSBywEdOlU= +github.com/sijms/go-ora/v2 v2.8.22/go.mod h1:QgFInVi3ZWyqAiJwzBQA+nbKYKH77tdp1PYoCqhR2dU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= +github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= +github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= +github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +golang.org/x/arch v0.22.0 h1:c/Zle32i5ttqRXjdLyyHZESLD/bB90DCU1g9l/0YBDI= +golang.org/x/arch v0.22.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A= +golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= +golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= +golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= +golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= +golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= +golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= +golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= +golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= +golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= +golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= +golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= +modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= +modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y= +modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= +modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= +modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U= +modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= +modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= +modernc.org/sqlite v1.34.5 h1:Bb6SR13/fjp15jt70CL4f18JIN7p7dnMExd+UFnF15g= +modernc.org/sqlite v1.34.5/go.mod h1:YLuNmX9NKs8wRNK2ko1LW1NGYcc9FkBO69JOt1AR9JE= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/apps/server/internal/ai/stub.go b/apps/server/internal/ai/stub.go new file mode 100644 index 0000000..53eee33 --- /dev/null +++ b/apps/server/internal/ai/stub.go @@ -0,0 +1,97 @@ +package ai + +import ( + "fmt" + "strings" +) + +type ChatReq struct { + Action string `json:"action"` + Prompt string `json:"prompt"` + SQL string `json:"sql"` + Driver string `json:"driver"` + Database string `json:"database"` + Error string `json:"error"` +} + +type ChatRes struct { + Content string `json:"content"` + SQL string `json:"sql,omitempty"` +} + +func Chat(req ChatReq) ChatRes { + driver := req.Driver + if driver == "" { + driver = "mysql" + } + db := req.Database + if db == "" { + db = "your_db" + } + sql := strings.TrimSpace(req.SQL) + prompt := strings.TrimSpace(req.Prompt) + + switch strings.ToLower(req.Action) { + case "generate", "ask": + q := prompt + if q == "" { + q = "示例查询" + } + gen := fmt.Sprintf("-- 根据描述生成(%s / %s)\n-- 需求: %s\nSELECT *\nFROM `%s`.some_table\nWHERE 1=1\nLIMIT 100;", driver, db, q, db) + return ChatRes{ + Content: fmt.Sprintf("已根据「%s」生成 SQL(stub,可替换为真实模型)。\n\n```sql\n%s\n```", q, gen), + SQL: gen, + } + case "explain": + if sql == "" { + sql = "SELECT 1" + } + return ChatRes{Content: fmt.Sprintf("## 解释 SQL\n\n```sql\n%s\n```\n\n- 这是一条在 **%s** 上执行的查询。\n- 建议检查 WHERE 条件是否走索引,避免 `SELECT *` 拉取过大结果集。\n- (stub 回复)", sql, driver)} + case "optimize": + opt := sql + if opt == "" { + opt = "SELECT id, name FROM users WHERE status = 1 LIMIT 100;" + } else if strings.Contains(strings.ToUpper(opt), "SELECT *") { + opt = strings.Replace(opt, "*", "id /* TODO: 显式列 */", 1) + } + opt = strings.TrimSpace(opt) + if !strings.Contains(strings.ToUpper(opt), "LIMIT") { + opt = opt + "\nLIMIT 100;" + } + return ChatRes{ + Content: fmt.Sprintf("## 优化建议\n\n1. 避免不必要的全表扫描\n2. 显式列出列名\n3. 加合理 LIMIT\n\n```sql\n%s\n```", opt), + SQL: opt, + } + case "fix": + fixed := sql + if fixed == "" { + fixed = "SELECT 1 AS ok;" + } + msg := req.Error + if msg == "" { + msg = "未知错误" + } + return ChatRes{ + Content: fmt.Sprintf("## 修复错误\n\n原错误:`%s`\n\n尝试修正后的 SQL:\n\n```sql\n%s\n```\n\n(stub:请结合真实报错继续调整)", msg, fixed), + SQL: fixed, + } + case "dialect": + out := sql + if out == "" { + out = "SELECT * FROM dual" + } + out = strings.ReplaceAll(out, "`", "\"") + return ChatRes{ + Content: fmt.Sprintf("## 方言转换 → PostgreSQL 风格(示例)\n\n```sql\n%s\n```", out), + SQL: out, + } + case "sample": + sample := fmt.Sprintf("SELECT id, name, created_at\nFROM `%s`.users\nORDER BY id DESC\nLIMIT 20;", db) + return ChatRes{ + Content: fmt.Sprintf("## 样例 SQL(%s)\n\n```sql\n%s\n```", driver, sample), + SQL: sample, + } + default: + return ChatRes{Content: "未知 AI 动作。可用:ask / generate / explain / optimize / fix / dialect / sample"} + } +} diff --git a/apps/server/internal/db/danger.go b/apps/server/internal/db/danger.go new file mode 100644 index 0000000..ce6cf0c --- /dev/null +++ b/apps/server/internal/db/danger.go @@ -0,0 +1,50 @@ +package db + +import "strings" + +// IsDangerousSQL 识别可能破坏数据的语句,供前端二次确认。 +func IsDangerousSQL(sql string) bool { + s := stripSQLLead(sql) + if s == "" { + return false + } + up := strings.ToUpper(s) + for _, p := range []string{"DROP ", "DROP\t", "TRUNCATE ", "ALTER ", "GRANT ", "REVOKE "} { + if strings.HasPrefix(up, strings.TrimSpace(p)) || strings.HasPrefix(up, p) { + return true + } + } + if strings.HasPrefix(up, "DELETE") { + return !containsWhere(up) + } + if strings.HasPrefix(up, "UPDATE") { + return !containsWhere(up) + } + return false +} + +func containsWhere(up string) bool { + return strings.Contains(up, " WHERE ") || strings.Contains(up, "\nWHERE ") || strings.Contains(up, "\tWHERE ") +} + +func stripSQLLead(sql string) string { + s := strings.TrimSpace(sql) + for { + if strings.HasPrefix(s, "--") { + if i := strings.IndexByte(s, '\n'); i >= 0 { + s = strings.TrimSpace(s[i+1:]) + continue + } + return "" + } + if strings.HasPrefix(s, "/*") { + if i := strings.Index(s, "*/"); i >= 0 { + s = strings.TrimSpace(s[i+2:]) + continue + } + return "" + } + break + } + return s +} diff --git a/apps/server/internal/db/ident.go b/apps/server/internal/db/ident.go new file mode 100644 index 0000000..683a3d3 --- /dev/null +++ b/apps/server/internal/db/ident.go @@ -0,0 +1,19 @@ +package db + +import "strings" + +func quoteMySQLIdent(s string) string { + return "`" + strings.ReplaceAll(s, "`", "") + "`" +} + +func quotePGIdent(s string) string { + return `"` + strings.ReplaceAll(s, `"`, `""`) + `"` +} + +func splitSchemaTable(name string) (schema, table string) { + name = strings.TrimSpace(name) + if i := strings.LastIndex(name, "."); i > 0 { + return name[:i], name[i+1:] + } + return "", name +} diff --git a/apps/server/internal/db/mssql.go b/apps/server/internal/db/mssql.go new file mode 100644 index 0000000..e7400a3 --- /dev/null +++ b/apps/server/internal/db/mssql.go @@ -0,0 +1,139 @@ +package db + +import ( + "database/sql" + "fmt" + "net/url" + "strings" + + _ "github.com/microsoft/go-mssqldb" +) + +func openMSSQL(c ConnReq) (*sql.DB, error) { + host := c.Host + if host == "" { + host = "127.0.0.1" + } + port := c.Port + if port == 0 { + port = 1433 + } + user := c.User + if user == "" { + user = "sa" + } + dbName := c.Database + if dbName == "" { + dbName = "master" + } + mode := EffectiveSSLMode(c) + q := url.Values{} + q.Set("database", dbName) + q.Set("connection timeout", "5") + switch mode { + case "disable": + q.Set("encrypt", "disable") + case "skip-verify": + q.Set("encrypt", "true") + q.Set("TrustServerCertificate", "true") + if ca := strings.TrimSpace(c.SSLCA); ca != "" { + q.Set("certificate", ca) + } + case "require", "verify-ca": + q.Set("encrypt", "true") + q.Set("TrustServerCertificate", "false") + ca := strings.TrimSpace(c.SSLCA) + if mode == "verify-ca" && ca == "" { + return nil, fmt.Errorf("verify-ca 模式需要填写 CA 证书路径") + } + if ca != "" { + // go-mssqldb msdsn certificate= builds RootCAs from PEM/DER + q.Set("certificate", ca) + } + if host != "" { + q.Set("hostnameincertificate", host) + } + default: + return nil, fmt.Errorf("未知 SSL 模式: %s", mode) + } + dsn := fmt.Sprintf("sqlserver://%s:%s@%s:%d?%s", + url.QueryEscape(user), url.QueryEscape(c.Password), host, port, q.Encode()) + return sql.Open("sqlserver", dsn) +} + +func listDatabasesMSSQL(db *sql.DB) ([]string, error) { + rows, err := db.Query(`SELECT name FROM sys.databases WHERE name NOT IN ('master','tempdb','model','msdb') ORDER BY name`) + if err != nil { + return nil, err + } + defer rows.Close() + var out []string + for rows.Next() { + var name string + if err := rows.Scan(&name); err != nil { + return nil, err + } + out = append(out, name) + } + return out, rows.Err() +} + +func listTablesMSSQL(db *sql.DB, database string) ([]string, error) { + _ = database + rows, err := db.Query(` + SELECT TABLE_SCHEMA + '.' + TABLE_NAME + FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_TYPE = 'BASE TABLE' + ORDER BY 1`) + if err != nil { + return nil, err + } + defer rows.Close() + var out []string + for rows.Next() { + var name string + if err := rows.Scan(&name); err != nil { + return nil, err + } + out = append(out, name) + } + return out, rows.Err() +} + +func listColumnsMSSQL(dbh *sql.DB, _, table string) ([]ColumnInfo, error) { + schema, t := splitSchemaTable(table) + if schema == "" { + schema = "dbo" + } + rows, err := dbh.Query(` + SELECT COLUMN_NAME, DATA_TYPE, + ISNULL(CAST(CHARACTER_MAXIMUM_LENGTH AS varchar), ''), + IS_NULLABLE, COLUMN_DEFAULT + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = @p1 AND TABLE_NAME = @p2 + ORDER BY ORDINAL_POSITION`, schema, t) + if err != nil { + return nil, err + } + defer rows.Close() + var out []ColumnInfo + for rows.Next() { + var name, typ, extra, nullable string + var def sql.NullString + if err := rows.Scan(&name, &typ, &extra, &nullable, &def); err != nil { + return nil, err + } + if extra != "" && extra != "-1" { + typ = typ + "(" + extra + ")" + } + col := ColumnInfo{Name: name, Type: typ, Nullable: nullable == "YES"} + if def.Valid { + col.Default = def.String + } + out = append(out, col) + } + if out == nil { + out = []ColumnInfo{} + } + return out, rows.Err() +} diff --git a/apps/server/internal/db/mysql.go b/apps/server/internal/db/mysql.go new file mode 100644 index 0000000..1be4788 --- /dev/null +++ b/apps/server/internal/db/mysql.go @@ -0,0 +1,152 @@ +package db + +import ( + "crypto/sha256" + "database/sql" + "encoding/hex" + "fmt" + "net" + "time" + + mysqldriver "github.com/go-sql-driver/mysql" +) + +func openMySQL(c ConnReq) (*sql.DB, error) { + host := c.Host + if host == "" { + host = "127.0.0.1" + } + port := c.Port + if port == 0 { + port = 3306 + } + user := c.User + if user == "" { + user = "root" + } + cfg := mysqldriver.NewConfig() + cfg.User = user + cfg.Passwd = c.Password + cfg.Net = "tcp" + cfg.Addr = net.JoinHostPort(host, fmt.Sprintf("%d", port)) + cfg.DBName = c.Database + cfg.ParseTime = true + cfg.Timeout = 5 * time.Second + cfg.ReadTimeout = 30 * time.Second + cfg.WriteTimeout = 30 * time.Second + cfg.Loc = time.Local + cfg.Params = map[string]string{"charset": "utf8mb4"} + mode := EffectiveSSLMode(c) + switch mode { + case "disable": + // no TLS + case "skip-verify": + if c.SSLCA == "" && c.SSLCert == "" && c.SSLKey == "" { + cfg.TLSConfig = "skip-verify" + } else { + name, err := registerMySQLTLS(c) + if err != nil { + return nil, err + } + cfg.TLSConfig = name + } + case "require", "verify-ca": + if c.SSLCA == "" && c.SSLCert == "" && c.SSLKey == "" && mode == "require" { + cfg.TLSConfig = "true" + } else { + name, err := registerMySQLTLS(c) + if err != nil { + return nil, err + } + cfg.TLSConfig = name + } + default: + return nil, fmt.Errorf("未知 SSL 模式: %s", mode) + } + return sql.Open("mysql", cfg.FormatDSN()) +} + +func registerMySQLTLS(c ConnReq) (string, error) { + tlsCfg, err := tlsConfigFrom(c) + if err != nil { + return "", err + } + if tlsCfg == nil { + return "", fmt.Errorf("SSL 已启用但未能构建 TLS 配置") + } + sum := sha256.Sum256([]byte(EffectiveSSLMode(c) + "|" + c.SSLCA + "|" + c.SSLCert + "|" + c.SSLKey + "|" + c.Host)) + name := "opsxdb-" + hex.EncodeToString(sum[:8]) + mysqldriver.DeregisterTLSConfig(name) + if err := mysqldriver.RegisterTLSConfig(name, tlsCfg); err != nil { + return "", fmt.Errorf("注册 MySQL TLS 配置失败: %w", err) + } + return name, nil +} + +func listDatabasesMySQL(db *sql.DB) ([]string, error) { + rows, err := db.Query("SHOW DATABASES") + if err != nil { + return nil, err + } + defer rows.Close() + var out []string + for rows.Next() { + var name string + if err := rows.Scan(&name); err != nil { + return nil, err + } + out = append(out, name) + } + return out, rows.Err() +} + +func listTablesMySQL(db *sql.DB, database string) ([]string, error) { + q := "SHOW TABLES" + if database != "" { + q = "SHOW TABLES FROM " + quoteMySQLIdent(database) + } + rows, err := db.Query(q) + if err != nil { + return nil, err + } + defer rows.Close() + var out []string + for rows.Next() { + var name string + if err := rows.Scan(&name); err != nil { + return nil, err + } + out = append(out, name) + } + return out, rows.Err() +} + +func listColumnsMySQL(db *sql.DB, database, table string) ([]ColumnInfo, error) { + ident := quoteMySQLIdent(table) + if database != "" { + ident = quoteMySQLIdent(database) + "." + ident + } + rows, err := db.Query("SHOW FULL COLUMNS FROM " + ident) + if err != nil { + return nil, err + } + defer rows.Close() + var out []ColumnInfo + for rows.Next() { + var field, typ, null, key string + var collation, extra, priv, comment sql.NullString + var def sql.NullString + if err := rows.Scan(&field, &typ, &collation, &null, &key, &def, &extra, &priv, &comment); err != nil { + return nil, err + } + col := ColumnInfo{Name: field, Type: typ, Nullable: null == "YES", Key: key, Comment: comment.String} + if def.Valid { + col.Default = def.String + } + out = append(out, col) + } + if out == nil { + out = []ColumnInfo{} + } + return out, rows.Err() +} diff --git a/apps/server/internal/db/open.go b/apps/server/internal/db/open.go new file mode 100644 index 0000000..6d03ffb --- /dev/null +++ b/apps/server/internal/db/open.go @@ -0,0 +1,85 @@ +package db + +import ( + "database/sql" + "fmt" + "strings" + "time" +) + +func driverKey(d string) string { + return strings.ToLower(strings.TrimSpace(d)) +} + +func isMySQLFamily(d string) bool { + switch driverKey(d) { + case "mysql", "mariadb", "tidb", "oceanbase", "polardb", "tdsql": + return true + default: + return false + } +} + +func isPostgresFamily(d string) bool { + switch driverKey(d) { + case "postgresql", "postgres", "gaussdb", "opengauss", "kingbase": + return true + default: + return false + } +} + +// Open 按驱动打开 *sql.DB +func Open(c ConnReq) (*sql.DB, error) { + var ( + db *sql.DB + err error + ) + switch { + case isMySQLFamily(c.Driver): + db, err = openMySQL(c) + case isPostgresFamily(c.Driver): + db, err = openPostgres(c) + case driverKey(c.Driver) == "sqlserver" || driverKey(c.Driver) == "mssql": + db, err = openMSSQL(c) + case driverKey(c.Driver) == "oracle": + db, err = openOracle(c) + case driverKey(c.Driver) == "sqlite": + db, err = openSQLite(c) + default: + return nil, fmt.Errorf("驱动「%s」尚未实现(当前支持: mysql/mariadb/tidb、postgresql、sqlserver、oracle、sqlite、redis)", c.Driver) + } + if err != nil { + return nil, err + } + db.SetConnMaxLifetime(2 * time.Minute) + db.SetMaxOpenConns(5) + db.SetMaxIdleConns(2) + return db, nil +} + +func TestConnection(c ConnReq) error { + dial, tun, err := ApplySSHTunnel(c) + if err != nil { + return err + } + if tun != nil { + defer tun.Close() + } + if err := testDial(dial); err != nil { + return fmt.Errorf("数据库: %w", err) + } + return nil +} + +func testDial(c ConnReq) error { + if isRedis(c.Driver) { + return testRedis(c) + } + db, err := Open(c) + if err != nil { + return err + } + defer db.Close() + return db.Ping() +} diff --git a/apps/server/internal/db/ops.go b/apps/server/internal/db/ops.go new file mode 100644 index 0000000..40177fc --- /dev/null +++ b/apps/server/internal/db/ops.go @@ -0,0 +1,238 @@ +package db + +import ( + "context" + "errors" + "fmt" + "strings" + "time" +) + +func ListDatabases(c ConnReq) ([]string, error) { + if isRedis(c.Driver) { + return listDatabasesRedis(c) + } + cc := c + switch { + case isMySQLFamily(c.Driver): + cc.Database = "" + case isPostgresFamily(c.Driver): + if cc.Database == "" { + cc.Database = "postgres" + } + case driverKey(c.Driver) == "sqlserver" || driverKey(c.Driver) == "mssql": + if cc.Database == "" { + cc.Database = "master" + } + } + db, err := Open(cc) + if err != nil { + return nil, err + } + defer db.Close() + switch { + case isMySQLFamily(c.Driver): + return listDatabasesMySQL(db) + case isPostgresFamily(c.Driver): + return listDatabasesPostgres(db) + case driverKey(c.Driver) == "sqlserver" || driverKey(c.Driver) == "mssql": + return listDatabasesMSSQL(db) + case driverKey(c.Driver) == "oracle": + return listDatabasesOracle(db) + case driverKey(c.Driver) == "sqlite": + return listDatabasesSQLite(db) + default: + return nil, fmt.Errorf("unsupported driver") + } +} + +func ListTables(c ConnReq) ([]string, error) { + if isRedis(c.Driver) { + return listTablesRedis(c) + } + db, err := Open(c) + if err != nil { + return nil, err + } + defer db.Close() + switch { + case isMySQLFamily(c.Driver): + return listTablesMySQL(db, c.Database) + case isPostgresFamily(c.Driver): + return listTablesPostgres(db, c.Database) + case driverKey(c.Driver) == "sqlserver" || driverKey(c.Driver) == "mssql": + return listTablesMSSQL(db, c.Database) + case driverKey(c.Driver) == "oracle": + return listTablesOracle(db, c.Database) + case driverKey(c.Driver) == "sqlite": + return listTablesSQLite(db, c.Database) + default: + return nil, fmt.Errorf("unsupported driver") + } +} + +func ListColumns(c ConnReq) ([]ColumnInfo, error) { + if c.Table == "" { + return nil, fmt.Errorf("缺少表名") + } + if isRedis(c.Driver) { + return listColumnsRedis(c, c.Table) + } + db, err := Open(c) + if err != nil { + return nil, err + } + defer db.Close() + switch { + case isMySQLFamily(c.Driver): + return listColumnsMySQL(db, c.Database, c.Table) + case isPostgresFamily(c.Driver): + return listColumnsPostgres(db, c.Database, c.Table) + case driverKey(c.Driver) == "sqlserver" || driverKey(c.Driver) == "mssql": + return listColumnsMSSQL(db, c.Database, c.Table) + case driverKey(c.Driver) == "oracle": + return listColumnsOracle(db, c.Database, c.Table) + case driverKey(c.Driver) == "sqlite": + return listColumnsSQLite(db, c.Database, c.Table) + default: + return nil, fmt.Errorf("unsupported driver") + } +} + +func rowLimit(c ConnReq) int { + n := c.Limit + if n <= 0 { + n = DefaultRowLimit + } + if n > MaxRowLimit { + n = MaxRowLimit + } + return n +} + +func errMsg(err error) string { + if err == nil { + return "" + } + if errors.Is(err, context.Canceled) { + return "已取消" + } + // client gone / deadline tied to request cancel + if errors.Is(err, context.DeadlineExceeded) { + return err.Error() + } + msg := err.Error() + if strings.Contains(msg, "context canceled") { + return "已取消" + } + return msg +} + +func execFail(start time.Time, err error) ExecResult { + return ExecResult{ + Columns: []string{}, + Rows: []map[string]interface{}{}, + TimeMs: time.Since(start).Milliseconds(), + Error: errMsg(err), + } +} + +// ExecSQL 执行查询 / 非查询语句。ctx 来自 HTTP 请求,客户端断开/Abort 时可取消 DB 调用。 +func ExecSQL(ctx context.Context, c ConnReq) ExecResult { + start := time.Now() + if ctx == nil { + ctx = context.Background() + } + if err := ctx.Err(); err != nil { + return execFail(start, err) + } + if strings.TrimSpace(c.SQL) == "" { + return ExecResult{Columns: []string{}, Rows: []map[string]interface{}{}, Error: "empty sql"} + } + if isRedis(c.Driver) { + return execRedis(ctx, c) + } + db, err := Open(c) + if err != nil { + return execFail(start, err) + } + defer db.Close() + + if !isQuerySQL(c.SQL) { + res, err := db.ExecContext(ctx, c.SQL) + if err != nil { + return execFail(start, err) + } + affected, _ := res.RowsAffected() + return ExecResult{ + Columns: []string{"affected_rows"}, + Rows: []map[string]interface{}{{"affected_rows": affected}}, + RowCount: 1, + TimeMs: time.Since(start).Milliseconds(), + } + } + + rows, err := db.QueryContext(ctx, c.SQL) + if err != nil { + return execFail(start, err) + } + defer rows.Close() + + cols, err := rows.Columns() + if err != nil { + return execFail(start, err) + } + limit := rowLimit(c) + var resultRows []map[string]interface{} + truncated := false + for rows.Next() { + if err := ctx.Err(); err != nil { + return execFail(start, err) + } + raw := make([]interface{}, len(cols)) + ptrs := make([]interface{}, len(cols)) + for i := range raw { + ptrs[i] = &raw[i] + } + if err := rows.Scan(ptrs...); err != nil { + return execFail(start, err) + } + m := make(map[string]interface{}, len(cols)) + for i, col := range cols { + m[col] = normalize(raw[i]) + } + resultRows = append(resultRows, m) + if len(resultRows) >= limit { + truncated = true + break + } + } + if err := rows.Err(); err != nil { + return execFail(start, err) + } + if resultRows == nil { + resultRows = []map[string]interface{}{} + } + return ExecResult{ + Columns: cols, + Rows: resultRows, + RowCount: len(resultRows), + TimeMs: time.Since(start).Milliseconds(), + Truncated: truncated, + Limit: limit, + } +} + +func isQuerySQL(sql string) bool { + s := stripSQLLead(sql) + if s == "" { + return true + } + up := strings.ToUpper(s) + for _, p := range []string{"SELECT", "SHOW", "DESCRIBE", "DESC", "EXPLAIN", "WITH", "PRAGMA"} { + if strings.HasPrefix(up, p+" ") || up == p || strings.HasPrefix(up, p+"\t") || strings.HasPrefix(up, p+"\n") { + return true + } + } + return false +} diff --git a/apps/server/internal/db/ops_test.go b/apps/server/internal/db/ops_test.go new file mode 100644 index 0000000..0cdd489 --- /dev/null +++ b/apps/server/internal/db/ops_test.go @@ -0,0 +1,39 @@ +package db + +import ( + "context" + "testing" +) + +func TestIsQuerySQL(t *testing.T) { + if !isQuerySQL("SELECT 1") { + t.Fatal("select") + } + if isQuerySQL("DELETE FROM t") { + t.Fatal("delete is not query") + } + if !isQuerySQL("-- hi\nSELECT 1") { + t.Fatal("comment then select") + } +} + +func TestIsDangerousSQL(t *testing.T) { + if !IsDangerousSQL("DROP TABLE users") { + t.Fatal("drop") + } + if !IsDangerousSQL("DELETE FROM users") { + t.Fatal("delete no where") + } + if IsDangerousSQL("DELETE FROM users WHERE id=1") { + t.Fatal("delete with where is ok") + } + if IsDangerousSQL("SELECT * FROM users") { + t.Fatal("select") + } +} + +func TestErrMsgCanceled(t *testing.T) { + if got := errMsg(context.Canceled); got != "已取消" { + t.Fatalf("got %q", got) + } +} diff --git a/apps/server/internal/db/oracle.go b/apps/server/internal/db/oracle.go new file mode 100644 index 0000000..d71d878 --- /dev/null +++ b/apps/server/internal/db/oracle.go @@ -0,0 +1,145 @@ +package db + +import ( + "database/sql" + "fmt" + "net/url" + + ora "github.com/sijms/go-ora/v2" +) + +func openOracle(c ConnReq) (*sql.DB, error) { + host := c.Host + if host == "" { + host = "127.0.0.1" + } + port := c.Port + if port == 0 { + port = 1521 + } + user := c.User + if user == "" { + user = "system" + } + service := c.Service + if service == "" { + if c.Database != "" { + service = c.Database + } else { + service = "XEPDB1" + } + } + dsn := fmt.Sprintf("oracle://%s:%s@%s:%d/%s", url.PathEscape(user), url.PathEscape(c.Password), host, port, service) + mode := EffectiveSSLMode(c) + if mode != "disable" { + q := url.Values{} + q.Set("SSL", "true") + if mode == "skip-verify" { + q.Set("SSL VERIFY", "false") + } else { + q.Set("SSL VERIFY", "true") + } + dsn = dsn + "?" + q.Encode() + } + + tlsCfg, err := tlsConfigFrom(c) + if err != nil { + return nil, err + } + if tlsCfg != nil { + connector := ora.NewConnector(dsn) + oc, ok := connector.(*ora.OracleConnector) + if !ok { + return nil, fmt.Errorf("oracle: connector 类型异常") + } + oc.WithTLSConfig(tlsCfg) + return sql.OpenDB(oc), nil + } + return sql.Open("oracle", dsn) +} + +func listDatabasesOracle(db *sql.DB) ([]string, error) { + // 返回当前用户可见 schema + rows, err := db.Query(`SELECT username FROM all_users ORDER BY username`) + if err != nil { + return nil, err + } + defer rows.Close() + var out []string + for rows.Next() { + var name string + if err := rows.Scan(&name); err != nil { + return nil, err + } + out = append(out, name) + } + return out, rows.Err() +} + +func listTablesOracle(db *sql.DB, schema string) ([]string, error) { + var ( + rows *sql.Rows + err error + ) + if schema == "" { + rows, err = db.Query(`SELECT table_name FROM user_tables ORDER BY table_name`) + } else { + rows, err = db.Query(`SELECT table_name FROM all_tables WHERE owner = UPPER(:1) ORDER BY table_name`, schema) + } + if err != nil { + return nil, err + } + defer rows.Close() + var out []string + for rows.Next() { + var name string + if err := rows.Scan(&name); err != nil { + return nil, err + } + out = append(out, name) + } + return out, rows.Err() +} + +func listColumnsOracle(dbh *sql.DB, schema, table string) ([]ColumnInfo, error) { + owner, t := splitSchemaTable(table) + if owner == "" { + owner = schema + } + var ( + rows *sql.Rows + err error + ) + if owner == "" { + rows, err = dbh.Query(` + SELECT column_name, data_type, nullable, data_default + FROM user_tab_columns WHERE table_name = UPPER(:1) + ORDER BY column_id`, t) + } else { + rows, err = dbh.Query(` + SELECT column_name, data_type, nullable, data_default + FROM all_tab_columns WHERE owner = UPPER(:1) AND table_name = UPPER(:2) + ORDER BY column_id`, owner, t) + } + if err != nil { + return nil, err + } + defer rows.Close() + var out []ColumnInfo + for rows.Next() { + var name, typ, nullable string + var def sql.NullString + if err := rows.Scan(&name, &typ, &nullable, &def); err != nil { + return nil, err + } + col := ColumnInfo{Name: name, Type: typ, Nullable: nullable == "Y"} + if def.Valid { + col.Default = def.String + } + out = append(out, col) + } + if out == nil { + out = []ColumnInfo{} + } + return out, rows.Err() +} diff --git a/apps/server/internal/db/postgres.go b/apps/server/internal/db/postgres.go new file mode 100644 index 0000000..f92aefb --- /dev/null +++ b/apps/server/internal/db/postgres.go @@ -0,0 +1,147 @@ +package db + +import ( + "database/sql" + "fmt" + "strings" + + _ "github.com/jackc/pgx/v5/stdlib" +) + +func openPostgres(c ConnReq) (*sql.DB, error) { + host := c.Host + if host == "" { + host = "127.0.0.1" + } + port := c.Port + if port == 0 { + port = 5432 + } + user := c.User + if user == "" { + user = "postgres" + } + dbName := c.Database + if dbName == "" { + dbName = "postgres" + } + mode := EffectiveSSLMode(c) + sslmode := "disable" + switch mode { + case "disable": + sslmode = "disable" + case "require", "skip-verify": + // libpq require ≈ encrypt without CA/hostname verify + sslmode = "require" + case "verify-ca": + sslmode = "verify-ca" + if strings.TrimSpace(c.SSLCA) == "" { + return nil, fmt.Errorf("verify-ca 模式需要填写 CA 证书路径") + } + default: + return nil, fmt.Errorf("未知 SSL 模式: %s", mode) + } + + var b strings.Builder + fmt.Fprintf(&b, "host=%s port=%d user=%s password=%s dbname=%s sslmode=%s connect_timeout=5", + pqEscape(host), port, pqEscape(user), pqEscape(c.Password), pqEscape(dbName), sslmode) + if ca := strings.TrimSpace(c.SSLCA); ca != "" { + fmt.Fprintf(&b, " sslrootcert=%s", pqEscape(ca)) + } + if cert := strings.TrimSpace(c.SSLCert); cert != "" { + fmt.Fprintf(&b, " sslcert=%s", pqEscape(cert)) + } + if key := strings.TrimSpace(c.SSLKey); key != "" { + fmt.Fprintf(&b, " sslkey=%s", pqEscape(key)) + } + return sql.Open("pgx", b.String()) +} + +func pqEscape(v string) string { + if v == "" { + return "''" + } + needs := strings.ContainsAny(v, " '\\") + if !needs { + return v + } + return "'" + strings.ReplaceAll(strings.ReplaceAll(v, `\`, `\\`), `'`, `\'`) + "'" +} + +func listDatabasesPostgres(db *sql.DB) ([]string, error) { + rows, err := db.Query(`SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY 1`) + if err != nil { + return nil, err + } + defer rows.Close() + var out []string + for rows.Next() { + var name string + if err := rows.Scan(&name); err != nil { + return nil, err + } + out = append(out, name) + } + return out, rows.Err() +} + +func listTablesPostgres(db *sql.DB, database string) ([]string, error) { + // 当前连接库下的 public 表;切库需重新 Open + _ = database + rows, err := db.Query(` + SELECT CASE WHEN schemaname = 'public' THEN tablename ELSE schemaname || '.' || tablename END + FROM pg_catalog.pg_tables + WHERE schemaname NOT IN ('pg_catalog','information_schema') + ORDER BY 1`) + if err != nil { + return nil, err + } + defer rows.Close() + var out []string + for rows.Next() { + var name string + if err := rows.Scan(&name); err != nil { + return nil, err + } + out = append(out, name) + } + return out, rows.Err() +} + +func listColumnsPostgres(dbh *sql.DB, _, table string) ([]ColumnInfo, error) { + schema, t := splitSchemaTable(table) + if schema == "" { + schema = "public" + } + rows, err := dbh.Query(` + SELECT column_name, data_type, + COALESCE(character_maximum_length::text, numeric_precision::text, ''), + is_nullable, column_default + FROM information_schema.columns + WHERE table_schema = $1 AND table_name = $2 + ORDER BY ordinal_position`, schema, t) + if err != nil { + return nil, err + } + defer rows.Close() + var out []ColumnInfo + for rows.Next() { + var name, typ, extra, nullable string + var def sql.NullString + if err := rows.Scan(&name, &typ, &extra, &nullable, &def); err != nil { + return nil, err + } + if extra != "" { + typ = typ + "(" + extra + ")" + } + col := ColumnInfo{Name: name, Type: typ, Nullable: nullable == "YES"} + if def.Valid { + col.Default = def.String + } + out = append(out, col) + } + if out == nil { + out = []ColumnInfo{} + } + return out, rows.Err() +} diff --git a/apps/server/internal/db/redis.go b/apps/server/internal/db/redis.go new file mode 100644 index 0000000..f20a59f --- /dev/null +++ b/apps/server/internal/db/redis.go @@ -0,0 +1,597 @@ +package db + +import ( + "context" + "fmt" + "strconv" + "strings" + "time" + + "github.com/redis/go-redis/v9" +) + +func redisOpts(c ConnReq) (*redis.Options, error) { + host := c.Host + if host == "" { + host = "127.0.0.1" + } + port := c.Port + if port == 0 { + port = 6379 + } + db := 0 + if c.Database != "" { + if n, err := strconv.Atoi(c.Database); err == nil { + db = n + } + } + opts := &redis.Options{ + Addr: fmt.Sprintf("%s:%d", host, port), + Password: c.Password, + Username: c.User, + DB: db, + DialTimeout: 5 * time.Second, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + } + if SSLEnabled(c) { + tlsCfg, err := tlsConfigFrom(c) + if err != nil { + return nil, err + } + opts.TLSConfig = tlsCfg + } + return opts, nil +} + +func openRedis(c ConnReq) (*redis.Client, error) { + opts, err := redisOpts(c) + if err != nil { + return nil, err + } + return redis.NewClient(opts), nil +} + +func testRedis(c ConnReq) error { + cli, err := openRedis(c) + if err != nil { + return err + } + defer cli.Close() + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + return cli.Ping(ctx).Err() +} + +func listDatabasesRedis(c ConnReq) ([]string, error) { + cli, err := openRedis(c) + if err != nil { + return nil, err + } + defer cli.Close() + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + // INFO keyspace 可拿已用 DB;统一暴露 0-15 便于切换 + _ = ctx + out := make([]string, 16) + for i := 0; i < 16; i++ { + out[i] = strconv.Itoa(i) + } + return out, nil +} + +func listTablesRedis(c ConnReq) ([]string, error) { + cli, err := openRedis(c) + if err != nil { + return nil, err + } + defer cli.Close() + ctx, cancel := context.WithTimeout(context.Background(), 8*time.Second) + defer cancel() + var keys []string + var cursor uint64 + for { + batch, next, err := cli.Scan(ctx, cursor, "*", 200).Result() + if err != nil { + return nil, err + } + keys = append(keys, batch...) + cursor = next + if cursor == 0 || len(keys) >= 500 { + break + } + } + if keys == nil { + keys = []string{} + } + return keys, nil +} + +func execRedis(parent context.Context, c ConnReq) ExecResult { + start := time.Now() + sql := strings.TrimSpace(c.SQL) + if sql == "" { + return ExecResult{Error: "empty sql", TimeMs: 0} + } + cli, err := openRedis(c) + if err != nil { + return ExecResult{Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + defer cli.Close() + if parent == nil { + parent = context.Background() + } + ctx, cancel := context.WithTimeout(parent, 10*time.Second) + defer cancel() + + fields := splitRedisCmd(sql) + if len(fields) == 0 { + return ExecResult{Error: "empty command", TimeMs: time.Since(start).Milliseconds()} + } + cmd := strings.ToUpper(fields[0]) + args := fields[1:] + + switch cmd { + case "PING": + val, err := cli.Ping(ctx).Result() + if err != nil { + return ExecResult{Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + return ExecResult{Columns: []string{"result"}, Rows: []map[string]interface{}{{"result": val}}, RowCount: 1, TimeMs: time.Since(start).Milliseconds()} + case "GET": + if len(args) < 1 { + return ExecResult{Error: "GET key", TimeMs: time.Since(start).Milliseconds()} + } + val, err := cli.Get(ctx, args[0]).Result() + if err == redis.Nil { + return ExecResult{Columns: []string{"key", "value"}, Rows: []map[string]interface{}{}, RowCount: 0, TimeMs: time.Since(start).Milliseconds()} + } + if err != nil { + return ExecResult{Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + return ExecResult{Columns: []string{"key", "value"}, Rows: []map[string]interface{}{{"key": args[0], "value": val}}, RowCount: 1, TimeMs: time.Since(start).Milliseconds()} + case "SET": + if len(args) < 2 { + return ExecResult{Error: "SET key value", TimeMs: time.Since(start).Milliseconds()} + } + if err := cli.Set(ctx, args[0], strings.Join(args[1:], " "), 0).Err(); err != nil { + return ExecResult{Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + return ExecResult{Columns: []string{"affected_rows"}, Rows: []map[string]interface{}{{"affected_rows": 1}}, RowCount: 1, TimeMs: time.Since(start).Milliseconds()} + case "DEL": + if len(args) < 1 { + return ExecResult{Error: "DEL key [key...]", TimeMs: time.Since(start).Milliseconds()} + } + n, err := cli.Del(ctx, args...).Result() + if err != nil { + return ExecResult{Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + return ExecResult{Columns: []string{"affected_rows"}, Rows: []map[string]interface{}{{"affected_rows": n}}, RowCount: 1, TimeMs: time.Since(start).Milliseconds()} + case "KEYS": + pat := "*" + if len(args) > 0 { + pat = args[0] + } + keys, err := cli.Keys(ctx, pat).Result() + if err != nil { + return ExecResult{Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + rows := make([]map[string]interface{}, 0, len(keys)) + for _, k := range keys { + rows = append(rows, map[string]interface{}{"key": k}) + } + return ExecResult{Columns: []string{"key"}, Rows: rows, RowCount: len(rows), TimeMs: time.Since(start).Milliseconds()} + case "SCAN": + keys, err := listTablesRedis(c) + if err != nil { + return ExecResult{Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + rows := make([]map[string]interface{}, 0, len(keys)) + for _, k := range keys { + rows = append(rows, map[string]interface{}{"key": k}) + } + return ExecResult{Columns: []string{"key"}, Rows: rows, RowCount: len(rows), TimeMs: time.Since(start).Milliseconds()} + case "HGETALL": + if len(args) < 1 { + return ExecResult{Error: "HGETALL key", TimeMs: time.Since(start).Milliseconds()} + } + c2 := c + c2.Key = args[0] + c2.Limit = redisValueRowCap + v := GetRedisKey(c2) + if v.Error != "" && v.Type == "" { + return ExecResult{Error: v.Error, TimeMs: time.Since(start).Milliseconds()} + } + return ExecResult{Columns: v.Columns, Rows: v.Rows, RowCount: v.RowCount, TimeMs: time.Since(start).Milliseconds(), Truncated: v.Truncated, Limit: v.Limit, Error: v.Error} + case "LRANGE": + if len(args) < 1 { + return ExecResult{Error: "LRANGE key [start stop]", TimeMs: time.Since(start).Milliseconds()} + } + c2 := c + c2.Key = args[0] + c2.Limit = redisValueRowCap + v := GetRedisKey(c2) + return ExecResult{Columns: v.Columns, Rows: v.Rows, RowCount: v.RowCount, TimeMs: time.Since(start).Milliseconds(), Truncated: v.Truncated, Limit: v.Limit, Error: v.Error} + case "SMEMBERS": + if len(args) < 1 { + return ExecResult{Error: "SMEMBERS key", TimeMs: time.Since(start).Milliseconds()} + } + c2 := c + c2.Key = args[0] + v := GetRedisKey(c2) + return ExecResult{Columns: v.Columns, Rows: v.Rows, RowCount: v.RowCount, TimeMs: time.Since(start).Milliseconds(), Truncated: v.Truncated, Limit: v.Limit, Error: v.Error} + case "ZRANGE": + if len(args) < 1 { + return ExecResult{Error: "ZRANGE key [start stop]", TimeMs: time.Since(start).Milliseconds()} + } + c2 := c + c2.Key = args[0] + v := GetRedisKey(c2) + return ExecResult{Columns: v.Columns, Rows: v.Rows, RowCount: v.RowCount, TimeMs: time.Since(start).Milliseconds(), Truncated: v.Truncated, Limit: v.Limit, Error: v.Error} + case "TYPE": + if len(args) < 1 { + return ExecResult{Error: "TYPE key", TimeMs: time.Since(start).Milliseconds()} + } + t, err := cli.Type(ctx, args[0]).Result() + if err != nil { + return ExecResult{Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + return ExecResult{Columns: []string{"key", "type"}, Rows: []map[string]interface{}{{"key": args[0], "type": t}}, RowCount: 1, TimeMs: time.Since(start).Milliseconds()} + case "TTL": + if len(args) < 1 { + return ExecResult{Error: "TTL key", TimeMs: time.Since(start).Milliseconds()} + } + n, err := cli.TTL(ctx, args[0]).Result() + if err != nil { + return ExecResult{Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + return ExecResult{Columns: []string{"key", "ttl_sec"}, Rows: []map[string]interface{}{{"key": args[0], "ttl_sec": int64(n.Seconds())}}, RowCount: 1, TimeMs: time.Since(start).Milliseconds()} + default: + return ExecResult{Error: fmt.Sprintf("暂不支持命令 %s(可用: PING/GET/SET/DEL/KEYS/SCAN/TYPE/TTL/HGETALL/LRANGE/SMEMBERS/ZRANGE)", cmd), TimeMs: time.Since(start).Milliseconds()} + } +} + +func splitRedisCmd(s string) []string { + var out []string + var cur strings.Builder + inQ := false + esc := false + for _, r := range s { + switch { + case esc: + cur.WriteRune(r) + esc = false + case r == '\\': + esc = true + case r == '"': + inQ = !inQ + case !inQ && (r == ' ' || r == '\t' || r == '\n'): + if cur.Len() > 0 { + out = append(out, cur.String()) + cur.Reset() + } + default: + cur.WriteRune(r) + } + } + if cur.Len() > 0 { + out = append(out, cur.String()) + } + return out +} + +func isRedis(d string) bool { + return driverKey(d) == "redis" +} + +// IsRedisDriver exported for router guards. +func IsRedisDriver(d string) bool { + return isRedis(d) +} + +func listColumnsRedis(c ConnReq, key string) ([]ColumnInfo, error) { + cli, err := openRedis(c) + if err != nil { + return nil, err + } + defer cli.Close() + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + typ, err := cli.Type(ctx, key).Result() + if err != nil { + return nil, err + } + ttl, _ := cli.TTL(ctx, key).Result() + return []ColumnInfo{ + {Name: key, Type: typ, Comment: fmt.Sprintf("ttl=%ds", int64(ttl.Seconds()))}, + }, nil +} + +const redisKeyListCap = 500 +const redisValueRowCap = 500 + +func redisKeyName(c ConnReq) string { + if c.Key != "" { + return c.Key + } + return c.Table +} + +func redisScanPattern(c ConnReq) string { + p := strings.TrimSpace(c.Pattern) + if p == "" { + return "*" + } + return p +} + +func redisValueLimit(c ConnReq) int { + n := c.Limit + if n <= 0 { + n = redisValueRowCap + } + if n > MaxRowLimit { + n = MaxRowLimit + } + return n +} + +func ttlSeconds(d time.Duration) int64 { + // go-redis maps Redis TTL -1 (no expire) / -2 (missing) to -1ns/-2ns + // (some versions use -1s/-2s). Truncating with d/time.Second turns those into 0. + switch d { + case time.Duration(-1), -1 * time.Second: + return -1 + case time.Duration(-2), -2 * time.Second: + return -2 + } + return int64(d / time.Second) +} + +// ListRedisKeys SCAN + pipeline TYPE/TTL. Cap ~500. +func ListRedisKeys(c ConnReq) RedisKeysResult { + start := time.Now() + cli, err := openRedis(c) + if err != nil { + return RedisKeysResult{Keys: []RedisKeyInfo{}, Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + defer cli.Close() + ctx, cancel := context.WithTimeout(context.Background(), 12*time.Second) + defer cancel() + + pat := redisScanPattern(c) + var names []string + var cursor uint64 + truncated := false + for { + batch, next, err := cli.Scan(ctx, cursor, pat, 200).Result() + if err != nil { + return RedisKeysResult{Keys: []RedisKeyInfo{}, Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + names = append(names, batch...) + cursor = next + if len(names) >= redisKeyListCap { + truncated = true + names = names[:redisKeyListCap] + break + } + if cursor == 0 { + break + } + } + if names == nil { + names = []string{} + } + + out := make([]RedisKeyInfo, len(names)) + if len(names) == 0 { + return RedisKeysResult{Keys: out, Truncated: truncated, TimeMs: time.Since(start).Milliseconds()} + } + + // Pipeline TYPE + TTL (avoid N+1) + pipe := cli.Pipeline() + typeCmds := make([]*redis.StatusCmd, len(names)) + ttlCmds := make([]*redis.DurationCmd, len(names)) + for i, k := range names { + typeCmds[i] = pipe.Type(ctx, k) + ttlCmds[i] = pipe.TTL(ctx, k) + } + _, _ = pipe.Exec(ctx) + for i, k := range names { + typ := "none" + if t, err := typeCmds[i].Result(); err == nil { + typ = t + } + ttl := int64(-2) + if d, err := ttlCmds[i].Result(); err == nil { + ttl = ttlSeconds(d) + } + out[i] = RedisKeyInfo{Name: k, Type: typ, TTL: ttl} + } + return RedisKeysResult{Keys: out, Truncated: truncated, TimeMs: time.Since(start).Milliseconds()} +} + +// GetRedisKey typed value → ResultPane columns/rows. +func GetRedisKey(c ConnReq) RedisKeyValue { + start := time.Now() + key := redisKeyName(c) + if key == "" { + return RedisKeyValue{Error: "缺少 key", TimeMs: time.Since(start).Milliseconds()} + } + cli, err := openRedis(c) + if err != nil { + return RedisKeyValue{Name: key, Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + defer cli.Close() + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + typ, err := cli.Type(ctx, key).Result() + if err != nil { + return RedisKeyValue{Name: key, Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + ttl := int64(-2) + if d, err := cli.TTL(ctx, key).Result(); err == nil { + ttl = ttlSeconds(d) + } + limit := redisValueLimit(c) + base := RedisKeyValue{Name: key, Type: typ, TTL: ttl, Limit: limit} + + switch typ { + case "none": + base.Columns = []string{"value"} + base.Rows = []map[string]interface{}{} + base.RowCount = 0 + base.Error = "key 不存在" + base.TimeMs = time.Since(start).Milliseconds() + return base + case "string": + val, err := cli.Get(ctx, key).Result() + if err == redis.Nil { + base.Columns = []string{"value"} + base.Rows = []map[string]interface{}{} + base.RowCount = 0 + base.TimeMs = time.Since(start).Milliseconds() + return base + } + if err != nil { + base.Error = errMsg(err) + base.TimeMs = time.Since(start).Milliseconds() + return base + } + base.Columns = []string{"value"} + base.Rows = []map[string]interface{}{{"value": val}} + base.RowCount = 1 + base.TimeMs = time.Since(start).Milliseconds() + return base + case "hash": + fields, err := cli.HGetAll(ctx, key).Result() + if err != nil { + base.Error = errMsg(err) + base.TimeMs = time.Since(start).Milliseconds() + return base + } + base.Columns = []string{"field", "value"} + rows := make([]map[string]interface{}, 0, len(fields)) + for f, v := range fields { + rows = append(rows, map[string]interface{}{"field": f, "value": v}) + if len(rows) >= limit { + base.Truncated = true + break + } + } + base.Rows = rows + base.RowCount = len(rows) + base.TimeMs = time.Since(start).Milliseconds() + return base + case "list": + vals, err := cli.LRange(ctx, key, 0, int64(limit)-1).Result() + if err != nil { + base.Error = errMsg(err) + base.TimeMs = time.Since(start).Milliseconds() + return base + } + truncated := false + n, _ := cli.LLen(ctx, key).Result() + if n > int64(len(vals)) { + truncated = true + } + base.Columns = []string{"index", "value"} + rows := make([]map[string]interface{}, 0, len(vals)) + for i, v := range vals { + rows = append(rows, map[string]interface{}{"index": i, "value": v}) + } + base.Rows = rows + base.RowCount = len(rows) + base.Truncated = truncated + base.TimeMs = time.Since(start).Milliseconds() + return base + case "set": + base.Columns = []string{"member"} + var rows []map[string]interface{} + var scursor uint64 + truncated := false + for { + batch, next, err := cli.SScan(ctx, key, scursor, "*", 200).Result() + if err != nil { + base.Error = errMsg(err) + base.TimeMs = time.Since(start).Milliseconds() + return base + } + for _, m := range batch { + rows = append(rows, map[string]interface{}{"member": m}) + if len(rows) >= limit { + truncated = true + break + } + } + scursor = next + if truncated || scursor == 0 { + break + } + } + if rows == nil { + rows = []map[string]interface{}{} + } + base.Rows = rows + base.RowCount = len(rows) + base.Truncated = truncated + base.TimeMs = time.Since(start).Milliseconds() + return base + case "zset": + vals, err := cli.ZRangeWithScores(ctx, key, 0, int64(limit-1)).Result() + if err != nil { + base.Error = errMsg(err) + base.TimeMs = time.Since(start).Milliseconds() + return base + } + truncated := false + n, _ := cli.ZCard(ctx, key).Result() + if n > int64(len(vals)) { + truncated = true + } + base.Columns = []string{"score", "member"} + rows := make([]map[string]interface{}, 0, len(vals)) + for _, z := range vals { + rows = append(rows, map[string]interface{}{"score": z.Score, "member": z.Member}) + } + base.Rows = rows + base.RowCount = len(rows) + base.Truncated = truncated + base.TimeMs = time.Since(start).Milliseconds() + return base + default: + // stream / recon / module types: meta only + base.Columns = []string{"info"} + base.Rows = []map[string]interface{}{{"info": fmt.Sprintf("类型 %s 暂不展开,可用命令查看", typ)}} + base.RowCount = 1 + base.TimeMs = time.Since(start).Milliseconds() + return base + } +} + +// DeleteRedisKey DEL one key. +func DeleteRedisKey(c ConnReq) ExecResult { + start := time.Now() + key := redisKeyName(c) + if key == "" { + return ExecResult{Error: "缺少 key", TimeMs: time.Since(start).Milliseconds()} + } + cli, err := openRedis(c) + if err != nil { + return ExecResult{Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + defer cli.Close() + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + n, err := cli.Del(ctx, key).Result() + if err != nil { + return ExecResult{Error: errMsg(err), TimeMs: time.Since(start).Milliseconds()} + } + return ExecResult{ + Columns: []string{"affected_rows"}, + Rows: []map[string]interface{}{{"affected_rows": n}}, + RowCount: 1, + TimeMs: time.Since(start).Milliseconds(), + } +} diff --git a/apps/server/internal/db/redis_keys_test.go b/apps/server/internal/db/redis_keys_test.go new file mode 100644 index 0000000..32c06bb --- /dev/null +++ b/apps/server/internal/db/redis_keys_test.go @@ -0,0 +1,86 @@ +package db + +import ( + "net" + "strconv" + "testing" + + "github.com/alicebob/miniredis/v2" +) + +func TestListGetDeleteRedisKeys(t *testing.T) { + mr, err := miniredis.Run() + if err != nil { + t.Fatal(err) + } + defer mr.Close() + + _ = mr.Set("str:a", "hello") + mr.HSet("hash:b", "f1", "v1") + mr.Push("list:c", "x", "y") + mr.SAdd("set:d", "m1", "m2") + _, _ = mr.ZAdd("zset:e", 1.5, "zm") + + host, portStr, err := net.SplitHostPort(mr.Addr()) + if err != nil { + t.Fatal(err) + } + port, _ := strconv.Atoi(portStr) + base := ConnReq{Driver: "redis", Host: host, Port: port, Database: "0"} + + list := ListRedisKeys(base) + if list.Error != "" { + t.Fatal(list.Error) + } + if len(list.Keys) < 5 { + t.Fatalf("want >=5 keys, got %d %#v", len(list.Keys), list.Keys) + } + byName := map[string]RedisKeyInfo{} + for _, k := range list.Keys { + byName[k.Name] = k + } + if byName["str:a"].Type != "string" { + t.Fatalf("str type %s", byName["str:a"].Type) + } + if byName["hash:b"].Type != "hash" { + t.Fatalf("hash type %s", byName["hash:b"].Type) + } + // Real Redis returns -1 (no expire); miniredis may report 0. + if byName["str:a"].TTL < -1 { + t.Fatalf("unexpected ttl %d", byName["str:a"].TTL) + } + + gv := GetRedisKey(ConnReq{Driver: "redis", Host: host, Port: port, Database: "0", Key: "str:a"}) + if gv.Error != "" || gv.RowCount != 1 || gv.Rows[0]["value"] != "hello" { + t.Fatalf("get string %#v", gv) + } + gh := GetRedisKey(ConnReq{Driver: "redis", Host: host, Port: port, Database: "0", Key: "hash:b"}) + if gh.Error != "" || gh.RowCount < 1 || gh.Columns[0] != "field" { + t.Fatalf("get hash %#v", gh) + } + gl := GetRedisKey(ConnReq{Driver: "redis", Host: host, Port: port, Database: "0", Key: "list:c"}) + if gl.Error != "" || gl.RowCount < 2 { + t.Fatalf("get list %#v", gl) + } + gs := GetRedisKey(ConnReq{Driver: "redis", Host: host, Port: port, Database: "0", Key: "set:d"}) + if gs.Error != "" || gs.RowCount < 2 { + t.Fatalf("get set %#v", gs) + } + gz := GetRedisKey(ConnReq{Driver: "redis", Host: host, Port: port, Database: "0", Key: "zset:e"}) + if gz.Error != "" || gz.RowCount != 1 { + t.Fatalf("get zset %#v", gz) + } + + pat := ListRedisKeys(ConnReq{Driver: "redis", Host: host, Port: port, Database: "0", Pattern: "str:*"}) + if pat.Error != "" || len(pat.Keys) != 1 || pat.Keys[0].Name != "str:a" { + t.Fatalf("pattern %#v", pat) + } + + del := DeleteRedisKey(ConnReq{Driver: "redis", Host: host, Port: port, Database: "0", Key: "str:a"}) + if del.Error != "" { + t.Fatal(del.Error) + } + if mr.Exists("str:a") { + t.Fatal("key should be deleted") + } +} diff --git a/apps/server/internal/db/redis_ttl_test.go b/apps/server/internal/db/redis_ttl_test.go new file mode 100644 index 0000000..ec2a6c1 --- /dev/null +++ b/apps/server/internal/db/redis_ttl_test.go @@ -0,0 +1,29 @@ +package db + +import ( + "testing" + "time" +) + +func TestTTLSecondsSentinels(t *testing.T) { + cases := []struct { + in time.Duration + want int64 + }{ + {time.Duration(-1), -1}, + {-1 * time.Nanosecond, -1}, + {-1 * time.Second, -1}, + {time.Duration(-2), -2}, + {-2 * time.Nanosecond, -2}, + {-2 * time.Second, -2}, + {0, 0}, + {5 * time.Second, 5}, + {1500 * time.Millisecond, 1}, + } + for _, c := range cases { + got := ttlSeconds(c.in) + if got != c.want { + t.Fatalf("ttlSeconds(%v)=%d want %d", c.in, got, c.want) + } + } +} diff --git a/apps/server/internal/db/session.go b/apps/server/internal/db/session.go new file mode 100644 index 0000000..ee560f0 --- /dev/null +++ b/apps/server/internal/db/session.go @@ -0,0 +1,180 @@ +package db + +import ( + "crypto/rand" + "database/sql" + "encoding/hex" + "fmt" + "sync" + "time" + + "github.com/redis/go-redis/v9" +) + +const sessionTTL = 45 * time.Minute +const maxSessions = 64 + +type Session struct { + ID string + Conn ConnReq + mu sync.Mutex + sqlPool map[string]*sql.DB + redisCli *redis.Client + tunnel *SSHTunnel + LastUsed time.Time +} + +var ( + sessionsMu sync.Mutex + sessions = map[string]*Session{} +) + +func init() { + go func() { + t := time.NewTicker(2 * time.Minute) + defer t.Stop() + for range t.C { + expireSessions() + } + }() +} + +func newSessionID() string { + var b [16]byte + if _, err := rand.Read(b[:]); err != nil { + return fmt.Sprintf("%d", time.Now().UnixNano()) + } + return hex.EncodeToString(b[:]) +} + +func OpenSession(c ConnReq) (string, error) { + c.SQL = "" + c.Table = "" + c.Key = "" + c.Pattern = "" + c.SessionID = "" + + dial, tun, err := ApplySSHTunnel(c) + if err != nil { + return "", err + } + if err := testDial(dial); err != nil { + if tun != nil { + tun.Close() + } + return "", fmt.Errorf("数据库: %w", err) + } + + sessionsMu.Lock() + if len(sessions) >= maxSessions { + sessionsMu.Unlock() + if tun != nil { + tun.Close() + } + return "", fmt.Errorf("连接会话已满,请关闭不用的连接后重试") + } + id := newSessionID() + // Persist dialed endpoints (127.0.0.1:local) so later ops reuse the tunnel. + stored := dial + stored.SSHEnabled = false + s := &Session{ + ID: id, + Conn: stored, + sqlPool: map[string]*sql.DB{}, + tunnel: tun, + LastUsed: time.Now(), + } + sessions[id] = s + sessionsMu.Unlock() + return id, nil +} + +func GetSession(id string) (*Session, error) { + if id == "" { + return nil, fmt.Errorf("缺少 sessionId") + } + sessionsMu.Lock() + s, ok := sessions[id] + sessionsMu.Unlock() + if !ok { + return nil, fmt.Errorf("会话已失效,请重新连接") + } + s.mu.Lock() + s.LastUsed = time.Now() + s.mu.Unlock() + return s, nil +} + +func CloseSession(id string) { + sessionsMu.Lock() + s, ok := sessions[id] + if ok { + delete(sessions, id) + } + sessionsMu.Unlock() + if ok { + s.closeAll() + } +} + +func expireSessions() { + cutoff := time.Now().Add(-sessionTTL) + sessionsMu.Lock() + var dead []*Session + for id, s := range sessions { + s.mu.Lock() + stale := s.LastUsed.Before(cutoff) + s.mu.Unlock() + if stale { + dead = append(dead, s) + delete(sessions, id) + } + } + sessionsMu.Unlock() + for _, s := range dead { + s.closeAll() + } +} + +func (s *Session) closeAll() { + s.mu.Lock() + defer s.mu.Unlock() + for k, dbh := range s.sqlPool { + _ = dbh.Close() + delete(s.sqlPool, k) + } + if s.redisCli != nil { + _ = s.redisCli.Close() + s.redisCli = nil + } + if s.tunnel != nil { + s.tunnel.Close() + s.tunnel = nil + } +} + +func (s *Session) ConnFor(req ConnReq) ConnReq { + c := s.Conn + // SQLite 的 database 是文件路径,对象树里的 "main" 不能覆盖它 + if req.Database != "" && driverKey(c.Driver) != "sqlite" { + c.Database = req.Database + } + c.SQL = req.SQL + c.Table = req.Table + c.Key = req.Key + c.Pattern = req.Pattern + c.Limit = req.Limit + c.SessionID = s.ID + return c +} + +func ResolveConn(req ConnReq) (ConnReq, error) { + if req.SessionID == "" { + return req, nil + } + s, err := GetSession(req.SessionID) + if err != nil { + return req, err + } + return s.ConnFor(req), nil +} diff --git a/apps/server/internal/db/sqlite.go b/apps/server/internal/db/sqlite.go new file mode 100644 index 0000000..44ba578 --- /dev/null +++ b/apps/server/internal/db/sqlite.go @@ -0,0 +1,70 @@ +package db + +import ( + "database/sql" + "fmt" + + _ "modernc.org/sqlite" +) + +func openSQLite(c ConnReq) (*sql.DB, error) { + path := c.Database + if path == "" { + path = c.Host + } + if path == "" { + return nil, fmt.Errorf("SQLite 需要 database 填文件路径") + } + return sql.Open("sqlite", path) +} + +func listDatabasesSQLite(_ *sql.DB) ([]string, error) { + return []string{"main"}, nil +} + +func listTablesSQLite(db *sql.DB, _ string) ([]string, error) { + rows, err := db.Query(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY 1`) + if err != nil { + return nil, err + } + defer rows.Close() + out := []string{} + for rows.Next() { + var name string + if err := rows.Scan(&name); err != nil { + return nil, err + } + out = append(out, name) + } + return out, rows.Err() +} + +func listColumnsSQLite(dbh *sql.DB, _, table string) ([]ColumnInfo, error) { + rows, err := dbh.Query(`PRAGMA table_info(` + quotePGIdent(table) + `)`) + if err != nil { + return nil, err + } + defer rows.Close() + var out []ColumnInfo + for rows.Next() { + var cid int + var name, typ string + var notnull, pk int + var def sql.NullString + if err := rows.Scan(&cid, &name, &typ, ¬null, &def, &pk); err != nil { + return nil, err + } + col := ColumnInfo{Name: name, Type: typ, Nullable: notnull == 0} + if pk > 0 { + col.Key = "PRI" + } + if def.Valid { + col.Default = def.String + } + out = append(out, col) + } + if out == nil { + out = []ColumnInfo{} + } + return out, rows.Err() +} diff --git a/apps/server/internal/db/ssh_tunnel.go b/apps/server/internal/db/ssh_tunnel.go new file mode 100644 index 0000000..b9cef49 --- /dev/null +++ b/apps/server/internal/db/ssh_tunnel.go @@ -0,0 +1,216 @@ +package db + +import ( + "fmt" + "io" + "net" + "os" + "path/filepath" + "strings" + "sync" + "time" + + "golang.org/x/crypto/ssh" +) + +// SSHTunnel holds a local TCP listener that forwards through an SSH session +// to the remote database host:port (local port forward semantics). +type SSHTunnel struct { + LocalPort int + listener net.Listener + client *ssh.Client + cancel chan struct{} + wg sync.WaitGroup + once sync.Once +} + +func (t *SSHTunnel) Close() { + if t == nil { + return + } + t.once.Do(func() { + close(t.cancel) + if t.listener != nil { + _ = t.listener.Close() + } + if t.client != nil { + _ = t.client.Close() + } + t.wg.Wait() + }) +} + +// StartLocalForward dials SSH and listens on 127.0.0.1:0, forwarding to c.Host:c.Port. +func StartLocalForward(c ConnReq) (*SSHTunnel, error) { + sshHost := strings.TrimSpace(c.SSHHost) + if sshHost == "" { + return nil, fmt.Errorf("请填写 SSH 主机") + } + sshPort := c.SSHPort + if sshPort <= 0 { + sshPort = 22 + } + sshUser := strings.TrimSpace(c.SSHUser) + if sshUser == "" { + return nil, fmt.Errorf("请填写 SSH 用户") + } + + auth, err := sshAuthMethods(c) + if err != nil { + return nil, err + } + + cfg := &ssh.ClientConfig{ + User: sshUser, + Auth: auth, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), //nolint:gosec // product tunnel; host-key pinning later + Timeout: 12 * time.Second, + } + + addr := net.JoinHostPort(sshHost, fmt.Sprintf("%d", sshPort)) + client, err := ssh.Dial("tcp", addr, cfg) + if err != nil { + return nil, fmt.Errorf("无法连接跳板机 %s: %w", addr, err) + } + + ln, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + _ = client.Close() + return nil, fmt.Errorf("本地监听失败: %w", err) + } + localPort := ln.Addr().(*net.TCPAddr).Port + + remoteHost := c.Host + if remoteHost == "" { + remoteHost = "127.0.0.1" + } + remotePort := c.Port + if remotePort <= 0 { + remotePort = 3306 + } + remoteAddr := net.JoinHostPort(remoteHost, fmt.Sprintf("%d", remotePort)) + + tun := &SSHTunnel{ + LocalPort: localPort, + listener: ln, + client: client, + cancel: make(chan struct{}), + } + + tun.wg.Add(1) + go func() { + defer tun.wg.Done() + for { + conn, err := ln.Accept() + if err != nil { + select { + case <-tun.cancel: + return + default: + return + } + } + tun.wg.Add(1) + go func(local net.Conn) { + defer tun.wg.Done() + defer local.Close() + remote, err := client.Dial("tcp", remoteAddr) + if err != nil { + return + } + defer remote.Close() + pipe(local, remote) + }(conn) + } + }() + + return tun, nil +} + +func sshAuthMethods(c ConnReq) ([]ssh.AuthMethod, error) { + authMode := strings.ToLower(strings.TrimSpace(c.SSHAuth)) + if authMode == "" { + authMode = "password" + } + switch authMode { + case "password": + if c.SSHPassword == "" { + return nil, fmt.Errorf("请填写 SSH 密码") + } + return []ssh.AuthMethod{ssh.Password(c.SSHPassword)}, nil + case "privatekey", "key", "private_key": + keyMaterial, err := loadSSHPrivateKey(c.SSHPrivateKey) + if err != nil { + return nil, err + } + var signer ssh.Signer + if strings.TrimSpace(c.SSHPassphrase) != "" { + signer, err = ssh.ParsePrivateKeyWithPassphrase(keyMaterial, []byte(c.SSHPassphrase)) + } else { + signer, err = ssh.ParsePrivateKey(keyMaterial) + } + if err != nil { + return nil, fmt.Errorf("解析私钥失败: %w", err) + } + return []ssh.AuthMethod{ssh.PublicKeys(signer)}, nil + default: + return nil, fmt.Errorf("不支持的 SSH 认证方式: %s", c.SSHAuth) + } +} + +func loadSSHPrivateKey(raw string) ([]byte, error) { + s := strings.TrimSpace(raw) + if s == "" { + return nil, fmt.Errorf("请填写私钥 PEM 或路径") + } + if strings.Contains(s, "BEGIN") && strings.Contains(s, "PRIVATE KEY") { + return []byte(s), nil + } + path := s + if strings.HasPrefix(path, "~/") { + home, err := os.UserHomeDir() + if err != nil { + return nil, fmt.Errorf("展开 ~ 失败: %w", err) + } + path = filepath.Join(home, path[2:]) + } + b, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("读取私钥文件失败: %w", err) + } + return b, nil +} + +func pipe(a, b net.Conn) { + var wg sync.WaitGroup + wg.Add(2) + go func() { + defer wg.Done() + _, _ = io.Copy(a, b) + _ = a.Close() + }() + go func() { + defer wg.Done() + _, _ = io.Copy(b, a) + _ = b.Close() + }() + wg.Wait() +} + +// ApplySSHTunnel starts a local forward when sshEnabled and rewrites Host/Port to 127.0.0.1:. +// Caller must Close the returned tunnel (may be nil). +func ApplySSHTunnel(c ConnReq) (ConnReq, *SSHTunnel, error) { + if !c.SSHEnabled { + return c, nil, nil + } + tun, err := StartLocalForward(c) + if err != nil { + return c, nil, fmt.Errorf("SSH: %w", err) + } + out := c + out.Host = "127.0.0.1" + out.Port = tun.LocalPort + // Avoid nested tunnel if helpers re-enter + out.SSHEnabled = false + return out, tun, nil +} diff --git a/apps/server/internal/db/tls.go b/apps/server/internal/db/tls.go new file mode 100644 index 0000000..3d1e131 --- /dev/null +++ b/apps/server/internal/db/tls.go @@ -0,0 +1,115 @@ +package db + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "os" + "strings" +) + +// EffectiveSSLMode resolves ssl / sslMode for drivers. +// Checkbox off or mode disable → disable. Legacy ssl:true with empty mode → require. +func EffectiveSSLMode(c ConnReq) string { + mode := strings.ToLower(strings.TrimSpace(c.SSLMode)) + switch mode { + case "disable", "require", "skip-verify", "verify-ca": + if mode == "disable" { + return "disable" + } + return mode + } + if c.SSL { + return "require" + } + return "disable" +} + +// SSLEnabled is true when TLS should be negotiated. +func SSLEnabled(c ConnReq) bool { + return EffectiveSSLMode(c) != "disable" +} + +// tlsConfigFrom builds a *tls.Config from ConnReq paths/mode. +// Returns (nil, nil) when SSL is disabled. +func tlsConfigFrom(c ConnReq) (*tls.Config, error) { + mode := EffectiveSSLMode(c) + if mode == "disable" { + return nil, nil + } + + cfg := &tls.Config{ + MinVersion: tls.VersionTLS12, + } + if host := strings.TrimSpace(c.Host); host != "" { + cfg.ServerName = host + } + + switch mode { + case "skip-verify": + cfg.InsecureSkipVerify = true + case "require": + // Encrypt; verify with system / provided CAs when present. + case "verify-ca": + // Prefer explicit CA; still verify chain (hostname via ServerName when set). + default: + return nil, fmt.Errorf("未知 SSL 模式: %s", mode) + } + + if path := strings.TrimSpace(c.SSLCA); path != "" { + pem, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("读取 CA 证书失败 (%s): %w", path, err) + } + pool := x509.NewCertPool() + if !pool.AppendCertsFromPEM(pem) { + return nil, fmt.Errorf("CA 证书不是有效 PEM: %s", path) + } + cfg.RootCAs = pool + if mode == "verify-ca" { + // verify-ca: trust given CA but allow hostname mismatch (common for IP hosts) + cfg.InsecureSkipVerify = true + roots := pool + cfg.VerifyPeerCertificate = func(rawCerts [][]byte, _ [][]*x509.Certificate) error { + if len(rawCerts) == 0 { + return fmt.Errorf("服务端未提供证书") + } + certs := make([]*x509.Certificate, 0, len(rawCerts)) + for i, raw := range rawCerts { + cert, err := x509.ParseCertificate(raw) + if err != nil { + return fmt.Errorf("解析服务端证书失败: %w", err) + } + if i == 0 { + // keep leaf for Intermediates below + } + certs = append(certs, cert) + } + leaf := certs[0] + inter := x509.NewCertPool() + for _, cert := range certs[1:] { + inter.AddCert(cert) + } + _, err := leaf.Verify(x509.VerifyOptions{Roots: roots, Intermediates: inter}) + return err + } + } + } else if mode == "verify-ca" { + return nil, fmt.Errorf("verify-ca 模式需要填写 CA 证书路径") + } + + certPath := strings.TrimSpace(c.SSLCert) + keyPath := strings.TrimSpace(c.SSLKey) + if certPath != "" || keyPath != "" { + if certPath == "" || keyPath == "" { + return nil, fmt.Errorf("客户端证书与密钥需同时填写") + } + cert, err := tls.LoadX509KeyPair(certPath, keyPath) + if err != nil { + return nil, fmt.Errorf("加载客户端证书失败: %w", err) + } + cfg.Certificates = []tls.Certificate{cert} + } + + return cfg, nil +} diff --git a/apps/server/internal/db/tls_test.go b/apps/server/internal/db/tls_test.go new file mode 100644 index 0000000..4d7ebe4 --- /dev/null +++ b/apps/server/internal/db/tls_test.go @@ -0,0 +1,111 @@ +package db + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "math/big" + "os" + "path/filepath" + "testing" + "time" +) + +func TestEffectiveSSLMode(t *testing.T) { + if got := EffectiveSSLMode(ConnReq{}); got != "disable" { + t.Fatalf("empty -> disable, got %s", got) + } + if got := EffectiveSSLMode(ConnReq{SSL: true}); got != "require" { + t.Fatalf("ssl true -> require, got %s", got) + } + if got := EffectiveSSLMode(ConnReq{SSL: true, SSLMode: "skip-verify"}); got != "skip-verify" { + t.Fatalf("mode wins, got %s", got) + } + if got := EffectiveSSLMode(ConnReq{SSL: true, SSLMode: "disable"}); got != "disable" { + t.Fatalf("explicit disable, got %s", got) + } + if !SSLEnabled(ConnReq{SSLMode: "require"}) { + t.Fatal("require should enable") + } +} + +func TestTLSConfigFromDisable(t *testing.T) { + cfg, err := tlsConfigFrom(ConnReq{}) + if err != nil || cfg != nil { + t.Fatalf("disable => nil,nil got %#v %v", cfg, err) + } +} + +func TestTLSConfigFromSkipVerify(t *testing.T) { + cfg, err := tlsConfigFrom(ConnReq{SSL: true, SSLMode: "skip-verify", Host: "db.example"}) + if err != nil { + t.Fatal(err) + } + if cfg == nil || !cfg.InsecureSkipVerify { + t.Fatalf("expected InsecureSkipVerify, got %#v", cfg) + } + if cfg.ServerName != "db.example" { + t.Fatalf("ServerName %q", cfg.ServerName) + } +} + +func TestTLSConfigFromVerifyCARequiresPath(t *testing.T) { + _, err := tlsConfigFrom(ConnReq{SSLMode: "verify-ca"}) + if err == nil { + t.Fatal("expected error without CA") + } +} + +func TestTLSConfigFromVerifyCAWithPEM(t *testing.T) { + dir := t.TempDir() + caPath := filepath.Join(dir, "ca.pem") + if err := writeTestCA(caPath); err != nil { + t.Fatal(err) + } + cfg, err := tlsConfigFrom(ConnReq{SSLMode: "verify-ca", SSLCA: caPath, Host: "127.0.0.1"}) + if err != nil { + t.Fatal(err) + } + if cfg == nil || cfg.RootCAs == nil { + t.Fatal("expected RootCAs") + } + if cfg.VerifyPeerCertificate == nil { + t.Fatal("expected custom verify for verify-ca") + } +} + +func TestTLSConfigFromBadCAPath(t *testing.T) { + _, err := tlsConfigFrom(ConnReq{SSLMode: "require", SSLCA: "/no/such/ca.pem"}) + if err == nil { + t.Fatal("expected read error") + } +} + +func writeTestCA(path string) error { + key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + return err + } + tmpl := &x509.Certificate{ + SerialNumber: big.NewInt(1), + Subject: pkix.Name{CommonName: "opsxdb-test-ca"}, + NotBefore: time.Now().Add(-time.Hour), + NotAfter: time.Now().Add(24 * time.Hour), + IsCA: true, + KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageDigitalSignature, + BasicConstraintsValid: true, + } + der, err := x509.CreateCertificate(rand.Reader, tmpl, tmpl, &key.PublicKey, key) + if err != nil { + return err + } + f, err := os.Create(path) + if err != nil { + return err + } + defer f.Close() + return pem.Encode(f, &pem.Block{Type: "CERTIFICATE", Bytes: der}) +} diff --git a/apps/server/internal/db/types.go b/apps/server/internal/db/types.go new file mode 100644 index 0000000..74ac725 --- /dev/null +++ b/apps/server/internal/db/types.go @@ -0,0 +1,98 @@ +package db + +import "time" + +const DefaultRowLimit = 1000 +const MaxRowLimit = 10000 + +// ConnReq 连接 / 执行请求。sessionId 有值时服务端用会话里的账密,请求里的 password 可空。 +type ConnReq struct { + Driver string `json:"driver"` + Host string `json:"host"` + Port int `json:"port"` + User string `json:"user"` + Password string `json:"password"` + Database string `json:"database"` + SQL string `json:"sql"` + Service string `json:"service"` + SSL bool `json:"ssl"` + SSLMode string `json:"sslMode"` // disable|require|skip-verify|verify-ca + SSLCA string `json:"sslCA"` + SSLCert string `json:"sslCert"` + SSLKey string `json:"sslKey"` + SessionID string `json:"sessionId"` + Table string `json:"table"` + Limit int `json:"limit"` + Key string `json:"key"` // Redis key (get/delete) + Pattern string `json:"pattern"` // Redis SCAN match + + SSHEnabled bool `json:"sshEnabled"` + SSHHost string `json:"sshHost"` + SSHPort int `json:"sshPort"` + SSHUser string `json:"sshUser"` + SSHAuth string `json:"sshAuth"` // password | privateKey + SSHPassword string `json:"sshPassword"` + SSHPrivateKey string `json:"sshPrivateKey"` + SSHPassphrase string `json:"sshPassphrase"` +} + +type ColumnInfo struct { + Name string `json:"name"` + Type string `json:"type"` + Nullable bool `json:"nullable"` + Key string `json:"key,omitempty"` + Default any `json:"default,omitempty"` + Comment string `json:"comment,omitempty"` +} + +// ExecResult 与前端 QueryResult 字段对齐 +type ExecResult struct { + Columns []string `json:"columns"` + Rows []map[string]interface{} `json:"rows"` + RowCount int `json:"rowCount"` + TimeMs int64 `json:"timeMs"` + Error string `json:"error,omitempty"` + Truncated bool `json:"truncated,omitempty"` + Limit int `json:"limit,omitempty"` +} + +func normalize(v interface{}) interface{} { + switch t := v.(type) { + case nil: + return nil + case []byte: + return string(t) + case time.Time: + return t.Format(time.RFC3339Nano) + default: + return t + } +} + +// Redis key browse (dedicated endpoints; do not reshape SQL tables []). +type RedisKeyInfo struct { + Name string `json:"name"` + Type string `json:"type"` + TTL int64 `json:"ttl"` // seconds; -1 no expire; -2 missing +} + +type RedisKeysResult struct { + Keys []RedisKeyInfo `json:"keys"` + Truncated bool `json:"truncated,omitempty"` + TimeMs int64 `json:"timeMs"` + Error string `json:"error,omitempty"` +} + +// RedisKeyValue feeds ResultPane (columns/rows) plus type/ttl meta. +type RedisKeyValue struct { + Name string `json:"name"` + Type string `json:"type"` + TTL int64 `json:"ttl"` + Columns []string `json:"columns"` + Rows []map[string]interface{} `json:"rows"` + RowCount int `json:"rowCount"` + TimeMs int64 `json:"timeMs"` + Truncated bool `json:"truncated,omitempty"` + Limit int `json:"limit,omitempty"` + Error string `json:"error,omitempty"` +} diff --git a/apps/server/internal/docs/assets/docs.css b/apps/server/internal/docs/assets/docs.css new file mode 100644 index 0000000..9b85ea8 --- /dev/null +++ b/apps/server/internal/docs/assets/docs.css @@ -0,0 +1,39 @@ +:root { + --bg: #0e1116; --panel: #151a21; --border: #243044; + --text: #e6edf7; --muted: #8b9bb4; --accent: #3b82f6; +} +* { box-sizing: border-box; } +body { margin: 0; font: 13px/1.55 ui-sans-serif, system-ui, sans-serif; background: var(--bg); color: var(--text); } +.top { + height: 44px; border-bottom: 1px solid var(--border); background: var(--panel); + display: flex; align-items: center; justify-content: space-between; padding: 0 16px; +} +.brand { display: flex; align-items: center; gap: 8px; color: var(--text); text-decoration: none; font-weight: 600; } +.brand em { color: var(--muted); font-style: normal; font-weight: 500; } +.logo { + width: 24px; height: 24px; border-radius: 6px; background: var(--accent); + display: grid; place-items: center; font-size: 10px; font-weight: 700; color: #fff; +} +.top a { color: var(--muted); text-decoration: none; font-size: 12.5px; } +.layout { display: flex; min-height: calc(100vh - 44px); } +.side { + width: 200px; border-right: 1px solid var(--border); padding: 12px 10px; + background: var(--panel); display: flex; flex-direction: column; gap: 2px; +} +.nav-link { + display: block; padding: 6px 8px; border-radius: 6px; color: var(--muted); + text-decoration: none; font-size: 12.5px; +} +.nav-link:hover { color: var(--text); background: #1a2230; } +.nav-link.active { color: var(--text); background: color-mix(in srgb, var(--accent) 18%, transparent); } +.content { flex: 1; padding: 24px 28px; max-width: 720px; } +.content h1 { font-size: 20px; margin: 0 0 14px; } +.content h2 { font-size: 15px; margin: 22px 0 8px; } +.content p, .content li { color: #c5d0e0; } +.content code, .content pre { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; +} +.content pre { + background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px; +} +.content code { background: #1a2230; padding: 1px 5px; border-radius: 4px; } diff --git a/apps/server/internal/docs/content/connect.html b/apps/server/internal/docs/content/connect.html new file mode 100644 index 0000000..70583b7 --- /dev/null +++ b/apps/server/internal/docs/content/connect.html @@ -0,0 +1,7 @@ +