ZhaoShanGeng commited on
Commit
1560bc2
·
1 Parent(s): 9fc6da8

feat: 添加二进制编译支持

Browse files

- 添加 esbuild 和 pkg 依赖用于编译
- 创建 scripts/build.js 编译脚本
- 添加 GitHub Actions 工作流自动编译
- 修改多个文件支持 pkg 打包环境
- 支持 Windows x64, Linux x64, Linux ARM64, macOS x64, macOS ARM64

.github/workflows/build-binaries.yml ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Build Binaries
2
+
3
+ on:
4
+ push:
5
+ branches: [ 'binary-build', 'release/*' ]
6
+ tags: [ 'v*' ]
7
+ workflow_dispatch:
8
+ inputs:
9
+ platforms:
10
+ description: 'Platforms to build (comma-separated: win,linux,linux-arm64,macos,macos-arm64,all)'
11
+ required: false
12
+ default: 'all'
13
+
14
+ jobs:
15
+ build:
16
+ runs-on: ${{ matrix.os }}
17
+ strategy:
18
+ fail-fast: false
19
+ matrix:
20
+ include:
21
+ # Windows x64
22
+ - os: windows-latest
23
+ target: win
24
+ artifact_name: antigravity-win-x64
25
+ asset_name: antigravity-win-x64.zip
26
+ # Linux x64
27
+ - os: ubuntu-latest
28
+ target: linux
29
+ artifact_name: antigravity-linux-x64
30
+ asset_name: antigravity-linux-x64.tar.gz
31
+ # Linux ARM64 (for Termux)
32
+ - os: ubuntu-latest
33
+ target: linux-arm64
34
+ artifact_name: antigravity-linux-arm64
35
+ asset_name: antigravity-linux-arm64.tar.gz
36
+ # macOS x64
37
+ - os: macos-latest
38
+ target: macos
39
+ artifact_name: antigravity-macos-x64
40
+ asset_name: antigravity-macos-x64.tar.gz
41
+ # macOS ARM64
42
+ - os: macos-latest
43
+ target: macos-arm64
44
+ artifact_name: antigravity-macos-arm64
45
+ asset_name: antigravity-macos-arm64.tar.gz
46
+
47
+ steps:
48
+ - name: Checkout
49
+ uses: actions/checkout@v4
50
+
51
+ - name: Setup Node.js
52
+ uses: actions/setup-node@v4
53
+ with:
54
+ node-version: '18'
55
+ cache: 'npm'
56
+
57
+ - name: Install dependencies
58
+ run: npm ci
59
+
60
+ - name: Build binary
61
+ run: npm run build:${{ matrix.target }}
62
+
63
+ - name: List dist contents
64
+ run: |
65
+ echo "=== dist directory contents ==="
66
+ ls -la dist/
67
+ shell: bash
68
+
69
+ - name: Package (Windows)
70
+ if: matrix.os == 'windows-latest'
71
+ run: |
72
+ cd dist
73
+ 7z a -tzip ../${{ matrix.asset_name }} *
74
+ shell: pwsh
75
+
76
+ - name: Package (Unix)
77
+ if: matrix.os != 'windows-latest'
78
+ run: |
79
+ cd dist
80
+ tar -czvf ../${{ matrix.asset_name }} *
81
+ shell: bash
82
+
83
+ - name: Upload artifact
84
+ uses: actions/upload-artifact@v4
85
+ with:
86
+ name: ${{ matrix.artifact_name }}
87
+ path: ${{ matrix.asset_name }}
88
+ retention-days: 30
89
+
90
+ release:
91
+ needs: build
92
+ runs-on: ubuntu-latest
93
+ if: startsWith(github.ref, 'refs/tags/v')
94
+ permissions:
95
+ contents: write
96
+
97
+ steps:
98
+ - name: Download all artifacts
99
+ uses: actions/download-artifact@v4
100
+ with:
101
+ path: artifacts
102
+
103
+ - name: List artifacts
104
+ run: |
105
+ echo "=== Downloaded artifacts ==="
106
+ find artifacts -type f -ls
107
+
108
+ - name: Create Release
109
+ uses: softprops/action-gh-release@v1
110
+ with:
111
+ files: |
112
+ artifacts/**/*.zip
113
+ artifacts/**/*.tar.gz
114
+ generate_release_notes: true
115
+ draft: false
116
+ prerelease: ${{ contains(github.ref, '-beta') || contains(github.ref, '-alpha') || contains(github.ref, '-rc') }}
117
+ env:
118
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
.gitignore CHANGED
@@ -20,3 +20,6 @@ data/
20
  test/*.png
21
  test/*.jpeg
22
  public/images
 
 
 
 
20
  test/*.png
21
  test/*.jpeg
22
  public/images
23
+
24
+ # 编译输出
25
+ dist/
package-lock.json CHANGED
@@ -15,10 +15,599 @@
15
  "express": "^5.2.1",
16
  "jsonwebtoken": "^9.0.3"
17
  },
 
 
 
 
 
 
 
18
  "engines": {
19
  "node": ">=18.0.0"
20
  }
21
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  "node_modules/accepts": {
23
  "version": "2.0.0",
24
  "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
@@ -32,12 +621,71 @@
32
  "node": ">= 0.6"
33
  }
34
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  "node_modules/asynckit": {
36
  "version": "0.4.0",
37
  "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
38
  "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
39
  "license": "MIT"
40
  },
 
 
 
 
 
 
 
 
 
 
41
  "node_modules/axios": {
42
  "version": "1.13.2",
43
  "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
@@ -49,6 +697,54 @@
49
  "proxy-from-env": "^1.1.0"
50
  }
51
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  "node_modules/body-parser": {
53
  "version": "2.2.1",
54
  "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz",
@@ -73,6 +769,44 @@
73
  "url": "https://opencollective.com/express"
74
  }
75
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  "node_modules/buffer-equal-constant-time": {
77
  "version": "1.0.1",
78
  "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
@@ -117,6 +851,62 @@
117
  "url": "https://github.com/sponsors/ljharb"
118
  }
119
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  "node_modules/combined-stream": {
121
  "version": "1.0.8",
122
  "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -169,6 +959,13 @@
169
  "node": ">=6.6.0"
170
  }
171
  },
 
 
 
 
 
 
 
172
  "node_modules/cors": {
173
  "version": "2.8.5",
174
  "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
@@ -199,6 +996,32 @@
199
  }
200
  }
201
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
202
  "node_modules/delayed-stream": {
203
  "version": "1.0.0",
204
  "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -217,6 +1040,29 @@
217
  "node": ">= 0.8"
218
  }
219
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
  "node_modules/dotenv": {
221
  "version": "17.2.3",
222
  "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz",
@@ -258,6 +1104,13 @@
258
  "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
259
  "license": "MIT"
260
  },
 
 
 
 
 
 
 
261
  "node_modules/encodeurl": {
262
  "version": "2.0.0",
263
  "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
@@ -267,6 +1120,16 @@
267
  "node": ">= 0.8"
268
  }
269
  },
 
 
 
 
 
 
 
 
 
 
270
  "node_modules/es-define-property": {
271
  "version": "1.0.1",
272
  "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
@@ -312,6 +1175,58 @@
312
  "node": ">= 0.4"
313
  }
314
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
315
  "node_modules/escape-html": {
316
  "version": "1.0.3",
317
  "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -327,6 +1242,16 @@
327
  "node": ">= 0.6"
328
  }
329
  },
 
 
 
 
 
 
 
 
 
 
330
  "node_modules/express": {
331
  "version": "5.2.1",
332
  "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
@@ -370,6 +1295,46 @@
370
  "url": "https://opencollective.com/express"
371
  }
372
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
373
  "node_modules/finalhandler": {
374
  "version": "2.1.0",
375
  "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
@@ -453,13 +1418,47 @@
453
  "node": ">= 0.6"
454
  }
455
  },
456
- "node_modules/fresh": {
457
- "version": "2.0.0",
458
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
459
- "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
460
  "license": "MIT",
 
 
 
 
 
 
461
  "engines": {
462
- "node": ">= 0.8"
463
  }
464
  },
465
  "node_modules/function-bind": {
@@ -471,6 +1470,16 @@
471
  "url": "https://github.com/sponsors/ljharb"
472
  }
473
  },
 
 
 
 
 
 
 
 
 
 
474
  "node_modules/get-intrinsic": {
475
  "version": "1.3.0",
476
  "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -508,6 +1517,47 @@
508
  "node": ">= 0.4"
509
  }
510
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
511
  "node_modules/gopd": {
512
  "version": "1.2.0",
513
  "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -520,6 +1570,33 @@
520
  "url": "https://github.com/sponsors/ljharb"
521
  }
522
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
523
  "node_modules/has-symbols": {
524
  "version": "1.1.0",
525
  "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
@@ -579,6 +1656,20 @@
579
  "url": "https://opencollective.com/express"
580
  }
581
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
582
  "node_modules/iconv-lite": {
583
  "version": "0.7.0",
584
  "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
@@ -595,12 +1686,67 @@
595
  "url": "https://opencollective.com/express"
596
  }
597
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
598
  "node_modules/inherits": {
599
  "version": "2.0.4",
600
  "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
601
  "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
602
  "license": "ISC"
603
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
604
  "node_modules/ipaddr.js": {
605
  "version": "1.9.1",
606
  "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@@ -610,12 +1756,101 @@
610
  "node": ">= 0.10"
611
  }
612
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
613
  "node_modules/is-promise": {
614
  "version": "4.0.0",
615
  "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
616
  "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
617
  "license": "MIT"
618
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
619
  "node_modules/jsonwebtoken": {
620
  "version": "9.0.3",
621
  "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
@@ -731,6 +1966,30 @@
731
  "url": "https://github.com/sponsors/sindresorhus"
732
  }
733
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
734
  "node_modules/mime-db": {
735
  "version": "1.54.0",
736
  "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
@@ -752,12 +2011,89 @@
752
  "node": ">= 0.6"
753
  }
754
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
755
  "node_modules/ms": {
756
  "version": "2.1.3",
757
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
758
  "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
759
  "license": "MIT"
760
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
761
  "node_modules/negotiator": {
762
  "version": "1.0.0",
763
  "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
@@ -767,6 +2103,40 @@
767
  "node": ">= 0.6"
768
  }
769
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
770
  "node_modules/object-assign": {
771
  "version": "4.1.1",
772
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -809,6 +2179,16 @@
809
  "wrappy": "1"
810
  }
811
  },
 
 
 
 
 
 
 
 
 
 
812
  "node_modules/parseurl": {
813
  "version": "1.3.3",
814
  "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -818,14 +2198,142 @@
818
  "node": ">= 0.8"
819
  }
820
  },
821
- "node_modules/path-to-regexp": {
822
- "version": "8.3.0",
823
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
824
- "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
825
  "license": "MIT",
826
- "funding": {
827
- "type": "opencollective",
828
- "url": "https://opencollective.com/express"
829
  }
830
  },
831
  "node_modules/proxy-addr": {
@@ -847,6 +2355,17 @@
847
  "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
848
  "license": "MIT"
849
  },
 
 
 
 
 
 
 
 
 
 
 
850
  "node_modules/qs": {
851
  "version": "6.14.0",
852
  "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
@@ -862,6 +2381,27 @@
862
  "url": "https://github.com/sponsors/ljharb"
863
  }
864
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
865
  "node_modules/range-parser": {
866
  "version": "1.2.1",
867
  "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -886,6 +2426,103 @@
886
  "node": ">= 0.10"
887
  }
888
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
889
  "node_modules/router": {
890
  "version": "2.2.0",
891
  "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
@@ -902,6 +2539,30 @@
902
  "node": ">= 18"
903
  }
904
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
905
  "node_modules/safe-buffer": {
906
  "version": "5.2.1",
907
  "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -1055,6 +2716,63 @@
1055
  "url": "https://github.com/sponsors/ljharb"
1056
  }
1057
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1058
  "node_modules/statuses": {
1059
  "version": "2.0.2",
1060
  "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
@@ -1064,6 +2782,165 @@
1064
  "node": ">= 0.8"
1065
  }
1066
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1067
  "node_modules/toidentifier": {
1068
  "version": "1.0.1",
1069
  "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -1073,6 +2950,26 @@
1073
  "node": ">=0.6"
1074
  }
1075
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1076
  "node_modules/type-is": {
1077
  "version": "2.0.1",
1078
  "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
@@ -1087,6 +2984,16 @@
1087
  "node": ">= 0.6"
1088
  }
1089
  },
 
 
 
 
 
 
 
 
 
 
1090
  "node_modules/unpipe": {
1091
  "version": "1.0.0",
1092
  "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -1096,6 +3003,13 @@
1096
  "node": ">= 0.8"
1097
  }
1098
  },
 
 
 
 
 
 
 
1099
  "node_modules/vary": {
1100
  "version": "1.1.2",
1101
  "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -1105,11 +3019,86 @@
1105
  "node": ">= 0.8"
1106
  }
1107
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1108
  "node_modules/wrappy": {
1109
  "version": "1.0.2",
1110
  "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1111
  "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1112
  "license": "ISC"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1113
  }
1114
  }
1115
  }
 
15
  "express": "^5.2.1",
16
  "jsonwebtoken": "^9.0.3"
17
  },
18
+ "bin": {
19
+ "antigravity-to-openai": "src/server/index.js"
20
+ },
21
+ "devDependencies": {
22
+ "esbuild": "^0.27.2",
23
+ "pkg": "^5.8.1"
24
+ },
25
  "engines": {
26
  "node": ">=18.0.0"
27
  }
28
  },
29
+ "node_modules/@babel/generator": {
30
+ "version": "7.18.2",
31
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz",
32
+ "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==",
33
+ "dev": true,
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "@babel/types": "^7.18.2",
37
+ "@jridgewell/gen-mapping": "^0.3.0",
38
+ "jsesc": "^2.5.1"
39
+ },
40
+ "engines": {
41
+ "node": ">=6.9.0"
42
+ }
43
+ },
44
+ "node_modules/@babel/helper-string-parser": {
45
+ "version": "7.27.1",
46
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
47
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
48
+ "dev": true,
49
+ "license": "MIT",
50
+ "engines": {
51
+ "node": ">=6.9.0"
52
+ }
53
+ },
54
+ "node_modules/@babel/helper-validator-identifier": {
55
+ "version": "7.28.5",
56
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
57
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
58
+ "dev": true,
59
+ "license": "MIT",
60
+ "engines": {
61
+ "node": ">=6.9.0"
62
+ }
63
+ },
64
+ "node_modules/@babel/parser": {
65
+ "version": "7.18.4",
66
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz",
67
+ "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==",
68
+ "dev": true,
69
+ "license": "MIT",
70
+ "bin": {
71
+ "parser": "bin/babel-parser.js"
72
+ },
73
+ "engines": {
74
+ "node": ">=6.0.0"
75
+ }
76
+ },
77
+ "node_modules/@babel/types": {
78
+ "version": "7.19.0",
79
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz",
80
+ "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==",
81
+ "dev": true,
82
+ "license": "MIT",
83
+ "dependencies": {
84
+ "@babel/helper-string-parser": "^7.18.10",
85
+ "@babel/helper-validator-identifier": "^7.18.6",
86
+ "to-fast-properties": "^2.0.0"
87
+ },
88
+ "engines": {
89
+ "node": ">=6.9.0"
90
+ }
91
+ },
92
+ "node_modules/@esbuild/aix-ppc64": {
93
+ "version": "0.27.2",
94
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
95
+ "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
96
+ "cpu": [
97
+ "ppc64"
98
+ ],
99
+ "dev": true,
100
+ "license": "MIT",
101
+ "optional": true,
102
+ "os": [
103
+ "aix"
104
+ ],
105
+ "engines": {
106
+ "node": ">=18"
107
+ }
108
+ },
109
+ "node_modules/@esbuild/android-arm": {
110
+ "version": "0.27.2",
111
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
112
+ "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
113
+ "cpu": [
114
+ "arm"
115
+ ],
116
+ "dev": true,
117
+ "license": "MIT",
118
+ "optional": true,
119
+ "os": [
120
+ "android"
121
+ ],
122
+ "engines": {
123
+ "node": ">=18"
124
+ }
125
+ },
126
+ "node_modules/@esbuild/android-arm64": {
127
+ "version": "0.27.2",
128
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
129
+ "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
130
+ "cpu": [
131
+ "arm64"
132
+ ],
133
+ "dev": true,
134
+ "license": "MIT",
135
+ "optional": true,
136
+ "os": [
137
+ "android"
138
+ ],
139
+ "engines": {
140
+ "node": ">=18"
141
+ }
142
+ },
143
+ "node_modules/@esbuild/android-x64": {
144
+ "version": "0.27.2",
145
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
146
+ "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
147
+ "cpu": [
148
+ "x64"
149
+ ],
150
+ "dev": true,
151
+ "license": "MIT",
152
+ "optional": true,
153
+ "os": [
154
+ "android"
155
+ ],
156
+ "engines": {
157
+ "node": ">=18"
158
+ }
159
+ },
160
+ "node_modules/@esbuild/darwin-arm64": {
161
+ "version": "0.27.2",
162
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
163
+ "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
164
+ "cpu": [
165
+ "arm64"
166
+ ],
167
+ "dev": true,
168
+ "license": "MIT",
169
+ "optional": true,
170
+ "os": [
171
+ "darwin"
172
+ ],
173
+ "engines": {
174
+ "node": ">=18"
175
+ }
176
+ },
177
+ "node_modules/@esbuild/darwin-x64": {
178
+ "version": "0.27.2",
179
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
180
+ "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
181
+ "cpu": [
182
+ "x64"
183
+ ],
184
+ "dev": true,
185
+ "license": "MIT",
186
+ "optional": true,
187
+ "os": [
188
+ "darwin"
189
+ ],
190
+ "engines": {
191
+ "node": ">=18"
192
+ }
193
+ },
194
+ "node_modules/@esbuild/freebsd-arm64": {
195
+ "version": "0.27.2",
196
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
197
+ "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
198
+ "cpu": [
199
+ "arm64"
200
+ ],
201
+ "dev": true,
202
+ "license": "MIT",
203
+ "optional": true,
204
+ "os": [
205
+ "freebsd"
206
+ ],
207
+ "engines": {
208
+ "node": ">=18"
209
+ }
210
+ },
211
+ "node_modules/@esbuild/freebsd-x64": {
212
+ "version": "0.27.2",
213
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
214
+ "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
215
+ "cpu": [
216
+ "x64"
217
+ ],
218
+ "dev": true,
219
+ "license": "MIT",
220
+ "optional": true,
221
+ "os": [
222
+ "freebsd"
223
+ ],
224
+ "engines": {
225
+ "node": ">=18"
226
+ }
227
+ },
228
+ "node_modules/@esbuild/linux-arm": {
229
+ "version": "0.27.2",
230
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz",
231
+ "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==",
232
+ "cpu": [
233
+ "arm"
234
+ ],
235
+ "dev": true,
236
+ "license": "MIT",
237
+ "optional": true,
238
+ "os": [
239
+ "linux"
240
+ ],
241
+ "engines": {
242
+ "node": ">=18"
243
+ }
244
+ },
245
+ "node_modules/@esbuild/linux-arm64": {
246
+ "version": "0.27.2",
247
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
248
+ "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
249
+ "cpu": [
250
+ "arm64"
251
+ ],
252
+ "dev": true,
253
+ "license": "MIT",
254
+ "optional": true,
255
+ "os": [
256
+ "linux"
257
+ ],
258
+ "engines": {
259
+ "node": ">=18"
260
+ }
261
+ },
262
+ "node_modules/@esbuild/linux-ia32": {
263
+ "version": "0.27.2",
264
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
265
+ "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
266
+ "cpu": [
267
+ "ia32"
268
+ ],
269
+ "dev": true,
270
+ "license": "MIT",
271
+ "optional": true,
272
+ "os": [
273
+ "linux"
274
+ ],
275
+ "engines": {
276
+ "node": ">=18"
277
+ }
278
+ },
279
+ "node_modules/@esbuild/linux-loong64": {
280
+ "version": "0.27.2",
281
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
282
+ "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
283
+ "cpu": [
284
+ "loong64"
285
+ ],
286
+ "dev": true,
287
+ "license": "MIT",
288
+ "optional": true,
289
+ "os": [
290
+ "linux"
291
+ ],
292
+ "engines": {
293
+ "node": ">=18"
294
+ }
295
+ },
296
+ "node_modules/@esbuild/linux-mips64el": {
297
+ "version": "0.27.2",
298
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
299
+ "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
300
+ "cpu": [
301
+ "mips64el"
302
+ ],
303
+ "dev": true,
304
+ "license": "MIT",
305
+ "optional": true,
306
+ "os": [
307
+ "linux"
308
+ ],
309
+ "engines": {
310
+ "node": ">=18"
311
+ }
312
+ },
313
+ "node_modules/@esbuild/linux-ppc64": {
314
+ "version": "0.27.2",
315
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
316
+ "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
317
+ "cpu": [
318
+ "ppc64"
319
+ ],
320
+ "dev": true,
321
+ "license": "MIT",
322
+ "optional": true,
323
+ "os": [
324
+ "linux"
325
+ ],
326
+ "engines": {
327
+ "node": ">=18"
328
+ }
329
+ },
330
+ "node_modules/@esbuild/linux-riscv64": {
331
+ "version": "0.27.2",
332
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
333
+ "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
334
+ "cpu": [
335
+ "riscv64"
336
+ ],
337
+ "dev": true,
338
+ "license": "MIT",
339
+ "optional": true,
340
+ "os": [
341
+ "linux"
342
+ ],
343
+ "engines": {
344
+ "node": ">=18"
345
+ }
346
+ },
347
+ "node_modules/@esbuild/linux-s390x": {
348
+ "version": "0.27.2",
349
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
350
+ "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
351
+ "cpu": [
352
+ "s390x"
353
+ ],
354
+ "dev": true,
355
+ "license": "MIT",
356
+ "optional": true,
357
+ "os": [
358
+ "linux"
359
+ ],
360
+ "engines": {
361
+ "node": ">=18"
362
+ }
363
+ },
364
+ "node_modules/@esbuild/linux-x64": {
365
+ "version": "0.27.2",
366
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
367
+ "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
368
+ "cpu": [
369
+ "x64"
370
+ ],
371
+ "dev": true,
372
+ "license": "MIT",
373
+ "optional": true,
374
+ "os": [
375
+ "linux"
376
+ ],
377
+ "engines": {
378
+ "node": ">=18"
379
+ }
380
+ },
381
+ "node_modules/@esbuild/netbsd-arm64": {
382
+ "version": "0.27.2",
383
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
384
+ "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
385
+ "cpu": [
386
+ "arm64"
387
+ ],
388
+ "dev": true,
389
+ "license": "MIT",
390
+ "optional": true,
391
+ "os": [
392
+ "netbsd"
393
+ ],
394
+ "engines": {
395
+ "node": ">=18"
396
+ }
397
+ },
398
+ "node_modules/@esbuild/netbsd-x64": {
399
+ "version": "0.27.2",
400
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
401
+ "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
402
+ "cpu": [
403
+ "x64"
404
+ ],
405
+ "dev": true,
406
+ "license": "MIT",
407
+ "optional": true,
408
+ "os": [
409
+ "netbsd"
410
+ ],
411
+ "engines": {
412
+ "node": ">=18"
413
+ }
414
+ },
415
+ "node_modules/@esbuild/openbsd-arm64": {
416
+ "version": "0.27.2",
417
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz",
418
+ "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==",
419
+ "cpu": [
420
+ "arm64"
421
+ ],
422
+ "dev": true,
423
+ "license": "MIT",
424
+ "optional": true,
425
+ "os": [
426
+ "openbsd"
427
+ ],
428
+ "engines": {
429
+ "node": ">=18"
430
+ }
431
+ },
432
+ "node_modules/@esbuild/openbsd-x64": {
433
+ "version": "0.27.2",
434
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
435
+ "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
436
+ "cpu": [
437
+ "x64"
438
+ ],
439
+ "dev": true,
440
+ "license": "MIT",
441
+ "optional": true,
442
+ "os": [
443
+ "openbsd"
444
+ ],
445
+ "engines": {
446
+ "node": ">=18"
447
+ }
448
+ },
449
+ "node_modules/@esbuild/openharmony-arm64": {
450
+ "version": "0.27.2",
451
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz",
452
+ "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==",
453
+ "cpu": [
454
+ "arm64"
455
+ ],
456
+ "dev": true,
457
+ "license": "MIT",
458
+ "optional": true,
459
+ "os": [
460
+ "openharmony"
461
+ ],
462
+ "engines": {
463
+ "node": ">=18"
464
+ }
465
+ },
466
+ "node_modules/@esbuild/sunos-x64": {
467
+ "version": "0.27.2",
468
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz",
469
+ "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==",
470
+ "cpu": [
471
+ "x64"
472
+ ],
473
+ "dev": true,
474
+ "license": "MIT",
475
+ "optional": true,
476
+ "os": [
477
+ "sunos"
478
+ ],
479
+ "engines": {
480
+ "node": ">=18"
481
+ }
482
+ },
483
+ "node_modules/@esbuild/win32-arm64": {
484
+ "version": "0.27.2",
485
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
486
+ "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
487
+ "cpu": [
488
+ "arm64"
489
+ ],
490
+ "dev": true,
491
+ "license": "MIT",
492
+ "optional": true,
493
+ "os": [
494
+ "win32"
495
+ ],
496
+ "engines": {
497
+ "node": ">=18"
498
+ }
499
+ },
500
+ "node_modules/@esbuild/win32-ia32": {
501
+ "version": "0.27.2",
502
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
503
+ "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
504
+ "cpu": [
505
+ "ia32"
506
+ ],
507
+ "dev": true,
508
+ "license": "MIT",
509
+ "optional": true,
510
+ "os": [
511
+ "win32"
512
+ ],
513
+ "engines": {
514
+ "node": ">=18"
515
+ }
516
+ },
517
+ "node_modules/@esbuild/win32-x64": {
518
+ "version": "0.27.2",
519
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
520
+ "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
521
+ "cpu": [
522
+ "x64"
523
+ ],
524
+ "dev": true,
525
+ "license": "MIT",
526
+ "optional": true,
527
+ "os": [
528
+ "win32"
529
+ ],
530
+ "engines": {
531
+ "node": ">=18"
532
+ }
533
+ },
534
+ "node_modules/@jridgewell/gen-mapping": {
535
+ "version": "0.3.13",
536
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
537
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
538
+ "dev": true,
539
+ "license": "MIT",
540
+ "dependencies": {
541
+ "@jridgewell/sourcemap-codec": "^1.5.0",
542
+ "@jridgewell/trace-mapping": "^0.3.24"
543
+ }
544
+ },
545
+ "node_modules/@jridgewell/resolve-uri": {
546
+ "version": "3.1.2",
547
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
548
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
549
+ "dev": true,
550
+ "license": "MIT",
551
+ "engines": {
552
+ "node": ">=6.0.0"
553
+ }
554
+ },
555
+ "node_modules/@jridgewell/sourcemap-codec": {
556
+ "version": "1.5.5",
557
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
558
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
559
+ "dev": true,
560
+ "license": "MIT"
561
+ },
562
+ "node_modules/@jridgewell/trace-mapping": {
563
+ "version": "0.3.31",
564
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
565
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
566
+ "dev": true,
567
+ "license": "MIT",
568
+ "dependencies": {
569
+ "@jridgewell/resolve-uri": "^3.1.0",
570
+ "@jridgewell/sourcemap-codec": "^1.4.14"
571
+ }
572
+ },
573
+ "node_modules/@nodelib/fs.scandir": {
574
+ "version": "2.1.5",
575
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
576
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
577
+ "dev": true,
578
+ "license": "MIT",
579
+ "dependencies": {
580
+ "@nodelib/fs.stat": "2.0.5",
581
+ "run-parallel": "^1.1.9"
582
+ },
583
+ "engines": {
584
+ "node": ">= 8"
585
+ }
586
+ },
587
+ "node_modules/@nodelib/fs.stat": {
588
+ "version": "2.0.5",
589
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
590
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
591
+ "dev": true,
592
+ "license": "MIT",
593
+ "engines": {
594
+ "node": ">= 8"
595
+ }
596
+ },
597
+ "node_modules/@nodelib/fs.walk": {
598
+ "version": "1.2.8",
599
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
600
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
601
+ "dev": true,
602
+ "license": "MIT",
603
+ "dependencies": {
604
+ "@nodelib/fs.scandir": "2.1.5",
605
+ "fastq": "^1.6.0"
606
+ },
607
+ "engines": {
608
+ "node": ">= 8"
609
+ }
610
+ },
611
  "node_modules/accepts": {
612
  "version": "2.0.0",
613
  "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
 
621
  "node": ">= 0.6"
622
  }
623
  },
624
+ "node_modules/agent-base": {
625
+ "version": "6.0.2",
626
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
627
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
628
+ "dev": true,
629
+ "license": "MIT",
630
+ "dependencies": {
631
+ "debug": "4"
632
+ },
633
+ "engines": {
634
+ "node": ">= 6.0.0"
635
+ }
636
+ },
637
+ "node_modules/ansi-regex": {
638
+ "version": "5.0.1",
639
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
640
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
641
+ "dev": true,
642
+ "license": "MIT",
643
+ "engines": {
644
+ "node": ">=8"
645
+ }
646
+ },
647
+ "node_modules/ansi-styles": {
648
+ "version": "4.3.0",
649
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
650
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
651
+ "dev": true,
652
+ "license": "MIT",
653
+ "dependencies": {
654
+ "color-convert": "^2.0.1"
655
+ },
656
+ "engines": {
657
+ "node": ">=8"
658
+ },
659
+ "funding": {
660
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
661
+ }
662
+ },
663
+ "node_modules/array-union": {
664
+ "version": "2.1.0",
665
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
666
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
667
+ "dev": true,
668
+ "license": "MIT",
669
+ "engines": {
670
+ "node": ">=8"
671
+ }
672
+ },
673
  "node_modules/asynckit": {
674
  "version": "0.4.0",
675
  "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
676
  "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
677
  "license": "MIT"
678
  },
679
+ "node_modules/at-least-node": {
680
+ "version": "1.0.0",
681
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
682
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
683
+ "dev": true,
684
+ "license": "ISC",
685
+ "engines": {
686
+ "node": ">= 4.0.0"
687
+ }
688
+ },
689
  "node_modules/axios": {
690
  "version": "1.13.2",
691
  "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
 
697
  "proxy-from-env": "^1.1.0"
698
  }
699
  },
700
+ "node_modules/base64-js": {
701
+ "version": "1.5.1",
702
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
703
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
704
+ "dev": true,
705
+ "funding": [
706
+ {
707
+ "type": "github",
708
+ "url": "https://github.com/sponsors/feross"
709
+ },
710
+ {
711
+ "type": "patreon",
712
+ "url": "https://www.patreon.com/feross"
713
+ },
714
+ {
715
+ "type": "consulting",
716
+ "url": "https://feross.org/support"
717
+ }
718
+ ],
719
+ "license": "MIT"
720
+ },
721
+ "node_modules/bl": {
722
+ "version": "4.1.0",
723
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
724
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
725
+ "dev": true,
726
+ "license": "MIT",
727
+ "dependencies": {
728
+ "buffer": "^5.5.0",
729
+ "inherits": "^2.0.4",
730
+ "readable-stream": "^3.4.0"
731
+ }
732
+ },
733
+ "node_modules/bl/node_modules/readable-stream": {
734
+ "version": "3.6.2",
735
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
736
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
737
+ "dev": true,
738
+ "license": "MIT",
739
+ "dependencies": {
740
+ "inherits": "^2.0.3",
741
+ "string_decoder": "^1.1.1",
742
+ "util-deprecate": "^1.0.1"
743
+ },
744
+ "engines": {
745
+ "node": ">= 6"
746
+ }
747
+ },
748
  "node_modules/body-parser": {
749
  "version": "2.2.1",
750
  "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz",
 
769
  "url": "https://opencollective.com/express"
770
  }
771
  },
772
+ "node_modules/braces": {
773
+ "version": "3.0.3",
774
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
775
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
776
+ "dev": true,
777
+ "license": "MIT",
778
+ "dependencies": {
779
+ "fill-range": "^7.1.1"
780
+ },
781
+ "engines": {
782
+ "node": ">=8"
783
+ }
784
+ },
785
+ "node_modules/buffer": {
786
+ "version": "5.7.1",
787
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
788
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
789
+ "dev": true,
790
+ "funding": [
791
+ {
792
+ "type": "github",
793
+ "url": "https://github.com/sponsors/feross"
794
+ },
795
+ {
796
+ "type": "patreon",
797
+ "url": "https://www.patreon.com/feross"
798
+ },
799
+ {
800
+ "type": "consulting",
801
+ "url": "https://feross.org/support"
802
+ }
803
+ ],
804
+ "license": "MIT",
805
+ "dependencies": {
806
+ "base64-js": "^1.3.1",
807
+ "ieee754": "^1.1.13"
808
+ }
809
+ },
810
  "node_modules/buffer-equal-constant-time": {
811
  "version": "1.0.1",
812
  "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
 
851
  "url": "https://github.com/sponsors/ljharb"
852
  }
853
  },
854
+ "node_modules/chalk": {
855
+ "version": "4.1.2",
856
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
857
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
858
+ "dev": true,
859
+ "license": "MIT",
860
+ "dependencies": {
861
+ "ansi-styles": "^4.1.0",
862
+ "supports-color": "^7.1.0"
863
+ },
864
+ "engines": {
865
+ "node": ">=10"
866
+ },
867
+ "funding": {
868
+ "url": "https://github.com/chalk/chalk?sponsor=1"
869
+ }
870
+ },
871
+ "node_modules/chownr": {
872
+ "version": "1.1.4",
873
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
874
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
875
+ "dev": true,
876
+ "license": "ISC"
877
+ },
878
+ "node_modules/cliui": {
879
+ "version": "7.0.4",
880
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
881
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
882
+ "dev": true,
883
+ "license": "ISC",
884
+ "dependencies": {
885
+ "string-width": "^4.2.0",
886
+ "strip-ansi": "^6.0.0",
887
+ "wrap-ansi": "^7.0.0"
888
+ }
889
+ },
890
+ "node_modules/color-convert": {
891
+ "version": "2.0.1",
892
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
893
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
894
+ "dev": true,
895
+ "license": "MIT",
896
+ "dependencies": {
897
+ "color-name": "~1.1.4"
898
+ },
899
+ "engines": {
900
+ "node": ">=7.0.0"
901
+ }
902
+ },
903
+ "node_modules/color-name": {
904
+ "version": "1.1.4",
905
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
906
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
907
+ "dev": true,
908
+ "license": "MIT"
909
+ },
910
  "node_modules/combined-stream": {
911
  "version": "1.0.8",
912
  "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 
959
  "node": ">=6.6.0"
960
  }
961
  },
962
+ "node_modules/core-util-is": {
963
+ "version": "1.0.3",
964
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
965
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
966
+ "dev": true,
967
+ "license": "MIT"
968
+ },
969
  "node_modules/cors": {
970
  "version": "2.8.5",
971
  "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
 
996
  }
997
  }
998
  },
999
+ "node_modules/decompress-response": {
1000
+ "version": "6.0.0",
1001
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
1002
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
1003
+ "dev": true,
1004
+ "license": "MIT",
1005
+ "dependencies": {
1006
+ "mimic-response": "^3.1.0"
1007
+ },
1008
+ "engines": {
1009
+ "node": ">=10"
1010
+ },
1011
+ "funding": {
1012
+ "url": "https://github.com/sponsors/sindresorhus"
1013
+ }
1014
+ },
1015
+ "node_modules/deep-extend": {
1016
+ "version": "0.6.0",
1017
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
1018
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
1019
+ "dev": true,
1020
+ "license": "MIT",
1021
+ "engines": {
1022
+ "node": ">=4.0.0"
1023
+ }
1024
+ },
1025
  "node_modules/delayed-stream": {
1026
  "version": "1.0.0",
1027
  "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
 
1040
  "node": ">= 0.8"
1041
  }
1042
  },
1043
+ "node_modules/detect-libc": {
1044
+ "version": "2.1.2",
1045
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
1046
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
1047
+ "dev": true,
1048
+ "license": "Apache-2.0",
1049
+ "engines": {
1050
+ "node": ">=8"
1051
+ }
1052
+ },
1053
+ "node_modules/dir-glob": {
1054
+ "version": "3.0.1",
1055
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
1056
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
1057
+ "dev": true,
1058
+ "license": "MIT",
1059
+ "dependencies": {
1060
+ "path-type": "^4.0.0"
1061
+ },
1062
+ "engines": {
1063
+ "node": ">=8"
1064
+ }
1065
+ },
1066
  "node_modules/dotenv": {
1067
  "version": "17.2.3",
1068
  "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz",
 
1104
  "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
1105
  "license": "MIT"
1106
  },
1107
+ "node_modules/emoji-regex": {
1108
+ "version": "8.0.0",
1109
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1110
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1111
+ "dev": true,
1112
+ "license": "MIT"
1113
+ },
1114
  "node_modules/encodeurl": {
1115
  "version": "2.0.0",
1116
  "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
 
1120
  "node": ">= 0.8"
1121
  }
1122
  },
1123
+ "node_modules/end-of-stream": {
1124
+ "version": "1.4.5",
1125
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
1126
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
1127
+ "dev": true,
1128
+ "license": "MIT",
1129
+ "dependencies": {
1130
+ "once": "^1.4.0"
1131
+ }
1132
+ },
1133
  "node_modules/es-define-property": {
1134
  "version": "1.0.1",
1135
  "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
 
1175
  "node": ">= 0.4"
1176
  }
1177
  },
1178
+ "node_modules/esbuild": {
1179
+ "version": "0.27.2",
1180
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
1181
+ "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
1182
+ "dev": true,
1183
+ "hasInstallScript": true,
1184
+ "license": "MIT",
1185
+ "bin": {
1186
+ "esbuild": "bin/esbuild"
1187
+ },
1188
+ "engines": {
1189
+ "node": ">=18"
1190
+ },
1191
+ "optionalDependencies": {
1192
+ "@esbuild/aix-ppc64": "0.27.2",
1193
+ "@esbuild/android-arm": "0.27.2",
1194
+ "@esbuild/android-arm64": "0.27.2",
1195
+ "@esbuild/android-x64": "0.27.2",
1196
+ "@esbuild/darwin-arm64": "0.27.2",
1197
+ "@esbuild/darwin-x64": "0.27.2",
1198
+ "@esbuild/freebsd-arm64": "0.27.2",
1199
+ "@esbuild/freebsd-x64": "0.27.2",
1200
+ "@esbuild/linux-arm": "0.27.2",
1201
+ "@esbuild/linux-arm64": "0.27.2",
1202
+ "@esbuild/linux-ia32": "0.27.2",
1203
+ "@esbuild/linux-loong64": "0.27.2",
1204
+ "@esbuild/linux-mips64el": "0.27.2",
1205
+ "@esbuild/linux-ppc64": "0.27.2",
1206
+ "@esbuild/linux-riscv64": "0.27.2",
1207
+ "@esbuild/linux-s390x": "0.27.2",
1208
+ "@esbuild/linux-x64": "0.27.2",
1209
+ "@esbuild/netbsd-arm64": "0.27.2",
1210
+ "@esbuild/netbsd-x64": "0.27.2",
1211
+ "@esbuild/openbsd-arm64": "0.27.2",
1212
+ "@esbuild/openbsd-x64": "0.27.2",
1213
+ "@esbuild/openharmony-arm64": "0.27.2",
1214
+ "@esbuild/sunos-x64": "0.27.2",
1215
+ "@esbuild/win32-arm64": "0.27.2",
1216
+ "@esbuild/win32-ia32": "0.27.2",
1217
+ "@esbuild/win32-x64": "0.27.2"
1218
+ }
1219
+ },
1220
+ "node_modules/escalade": {
1221
+ "version": "3.2.0",
1222
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1223
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1224
+ "dev": true,
1225
+ "license": "MIT",
1226
+ "engines": {
1227
+ "node": ">=6"
1228
+ }
1229
+ },
1230
  "node_modules/escape-html": {
1231
  "version": "1.0.3",
1232
  "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
 
1242
  "node": ">= 0.6"
1243
  }
1244
  },
1245
+ "node_modules/expand-template": {
1246
+ "version": "2.0.3",
1247
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
1248
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
1249
+ "dev": true,
1250
+ "license": "(MIT OR WTFPL)",
1251
+ "engines": {
1252
+ "node": ">=6"
1253
+ }
1254
+ },
1255
  "node_modules/express": {
1256
  "version": "5.2.1",
1257
  "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
 
1295
  "url": "https://opencollective.com/express"
1296
  }
1297
  },
1298
+ "node_modules/fast-glob": {
1299
+ "version": "3.3.3",
1300
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
1301
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
1302
+ "dev": true,
1303
+ "license": "MIT",
1304
+ "dependencies": {
1305
+ "@nodelib/fs.stat": "^2.0.2",
1306
+ "@nodelib/fs.walk": "^1.2.3",
1307
+ "glob-parent": "^5.1.2",
1308
+ "merge2": "^1.3.0",
1309
+ "micromatch": "^4.0.8"
1310
+ },
1311
+ "engines": {
1312
+ "node": ">=8.6.0"
1313
+ }
1314
+ },
1315
+ "node_modules/fastq": {
1316
+ "version": "1.19.1",
1317
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
1318
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
1319
+ "dev": true,
1320
+ "license": "ISC",
1321
+ "dependencies": {
1322
+ "reusify": "^1.0.4"
1323
+ }
1324
+ },
1325
+ "node_modules/fill-range": {
1326
+ "version": "7.1.1",
1327
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1328
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1329
+ "dev": true,
1330
+ "license": "MIT",
1331
+ "dependencies": {
1332
+ "to-regex-range": "^5.0.1"
1333
+ },
1334
+ "engines": {
1335
+ "node": ">=8"
1336
+ }
1337
+ },
1338
  "node_modules/finalhandler": {
1339
  "version": "2.1.0",
1340
  "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
 
1418
  "node": ">= 0.6"
1419
  }
1420
  },
1421
+ "node_modules/fresh": {
1422
+ "version": "2.0.0",
1423
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
1424
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
1425
+ "license": "MIT",
1426
+ "engines": {
1427
+ "node": ">= 0.8"
1428
+ }
1429
+ },
1430
+ "node_modules/from2": {
1431
+ "version": "2.3.0",
1432
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
1433
+ "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
1434
+ "dev": true,
1435
+ "license": "MIT",
1436
+ "dependencies": {
1437
+ "inherits": "^2.0.1",
1438
+ "readable-stream": "^2.0.0"
1439
+ }
1440
+ },
1441
+ "node_modules/fs-constants": {
1442
+ "version": "1.0.0",
1443
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
1444
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
1445
+ "dev": true,
1446
+ "license": "MIT"
1447
+ },
1448
+ "node_modules/fs-extra": {
1449
+ "version": "9.1.0",
1450
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
1451
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
1452
+ "dev": true,
1453
  "license": "MIT",
1454
+ "dependencies": {
1455
+ "at-least-node": "^1.0.0",
1456
+ "graceful-fs": "^4.2.0",
1457
+ "jsonfile": "^6.0.1",
1458
+ "universalify": "^2.0.0"
1459
+ },
1460
  "engines": {
1461
+ "node": ">=10"
1462
  }
1463
  },
1464
  "node_modules/function-bind": {
 
1470
  "url": "https://github.com/sponsors/ljharb"
1471
  }
1472
  },
1473
+ "node_modules/get-caller-file": {
1474
+ "version": "2.0.5",
1475
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1476
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
1477
+ "dev": true,
1478
+ "license": "ISC",
1479
+ "engines": {
1480
+ "node": "6.* || 8.* || >= 10.*"
1481
+ }
1482
+ },
1483
  "node_modules/get-intrinsic": {
1484
  "version": "1.3.0",
1485
  "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
 
1517
  "node": ">= 0.4"
1518
  }
1519
  },
1520
+ "node_modules/github-from-package": {
1521
+ "version": "0.0.0",
1522
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
1523
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
1524
+ "dev": true,
1525
+ "license": "MIT"
1526
+ },
1527
+ "node_modules/glob-parent": {
1528
+ "version": "5.1.2",
1529
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1530
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1531
+ "dev": true,
1532
+ "license": "ISC",
1533
+ "dependencies": {
1534
+ "is-glob": "^4.0.1"
1535
+ },
1536
+ "engines": {
1537
+ "node": ">= 6"
1538
+ }
1539
+ },
1540
+ "node_modules/globby": {
1541
+ "version": "11.1.0",
1542
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
1543
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
1544
+ "dev": true,
1545
+ "license": "MIT",
1546
+ "dependencies": {
1547
+ "array-union": "^2.1.0",
1548
+ "dir-glob": "^3.0.1",
1549
+ "fast-glob": "^3.2.9",
1550
+ "ignore": "^5.2.0",
1551
+ "merge2": "^1.4.1",
1552
+ "slash": "^3.0.0"
1553
+ },
1554
+ "engines": {
1555
+ "node": ">=10"
1556
+ },
1557
+ "funding": {
1558
+ "url": "https://github.com/sponsors/sindresorhus"
1559
+ }
1560
+ },
1561
  "node_modules/gopd": {
1562
  "version": "1.2.0",
1563
  "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
 
1570
  "url": "https://github.com/sponsors/ljharb"
1571
  }
1572
  },
1573
+ "node_modules/graceful-fs": {
1574
+ "version": "4.2.11",
1575
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
1576
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
1577
+ "dev": true,
1578
+ "license": "ISC"
1579
+ },
1580
+ "node_modules/has": {
1581
+ "version": "1.0.4",
1582
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
1583
+ "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
1584
+ "dev": true,
1585
+ "license": "MIT",
1586
+ "engines": {
1587
+ "node": ">= 0.4.0"
1588
+ }
1589
+ },
1590
+ "node_modules/has-flag": {
1591
+ "version": "4.0.0",
1592
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1593
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1594
+ "dev": true,
1595
+ "license": "MIT",
1596
+ "engines": {
1597
+ "node": ">=8"
1598
+ }
1599
+ },
1600
  "node_modules/has-symbols": {
1601
  "version": "1.1.0",
1602
  "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
 
1656
  "url": "https://opencollective.com/express"
1657
  }
1658
  },
1659
+ "node_modules/https-proxy-agent": {
1660
+ "version": "5.0.1",
1661
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
1662
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
1663
+ "dev": true,
1664
+ "license": "MIT",
1665
+ "dependencies": {
1666
+ "agent-base": "6",
1667
+ "debug": "4"
1668
+ },
1669
+ "engines": {
1670
+ "node": ">= 6"
1671
+ }
1672
+ },
1673
  "node_modules/iconv-lite": {
1674
  "version": "0.7.0",
1675
  "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
 
1686
  "url": "https://opencollective.com/express"
1687
  }
1688
  },
1689
+ "node_modules/ieee754": {
1690
+ "version": "1.2.1",
1691
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
1692
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
1693
+ "dev": true,
1694
+ "funding": [
1695
+ {
1696
+ "type": "github",
1697
+ "url": "https://github.com/sponsors/feross"
1698
+ },
1699
+ {
1700
+ "type": "patreon",
1701
+ "url": "https://www.patreon.com/feross"
1702
+ },
1703
+ {
1704
+ "type": "consulting",
1705
+ "url": "https://feross.org/support"
1706
+ }
1707
+ ],
1708
+ "license": "BSD-3-Clause"
1709
+ },
1710
+ "node_modules/ignore": {
1711
+ "version": "5.3.2",
1712
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
1713
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
1714
+ "dev": true,
1715
+ "license": "MIT",
1716
+ "engines": {
1717
+ "node": ">= 4"
1718
+ }
1719
+ },
1720
  "node_modules/inherits": {
1721
  "version": "2.0.4",
1722
  "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1723
  "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1724
  "license": "ISC"
1725
  },
1726
+ "node_modules/ini": {
1727
+ "version": "1.3.8",
1728
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
1729
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
1730
+ "dev": true,
1731
+ "license": "ISC"
1732
+ },
1733
+ "node_modules/into-stream": {
1734
+ "version": "6.0.0",
1735
+ "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz",
1736
+ "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==",
1737
+ "dev": true,
1738
+ "license": "MIT",
1739
+ "dependencies": {
1740
+ "from2": "^2.3.0",
1741
+ "p-is-promise": "^3.0.0"
1742
+ },
1743
+ "engines": {
1744
+ "node": ">=10"
1745
+ },
1746
+ "funding": {
1747
+ "url": "https://github.com/sponsors/sindresorhus"
1748
+ }
1749
+ },
1750
  "node_modules/ipaddr.js": {
1751
  "version": "1.9.1",
1752
  "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
 
1756
  "node": ">= 0.10"
1757
  }
1758
  },
1759
+ "node_modules/is-core-module": {
1760
+ "version": "2.9.0",
1761
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
1762
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
1763
+ "dev": true,
1764
+ "license": "MIT",
1765
+ "dependencies": {
1766
+ "has": "^1.0.3"
1767
+ },
1768
+ "funding": {
1769
+ "url": "https://github.com/sponsors/ljharb"
1770
+ }
1771
+ },
1772
+ "node_modules/is-extglob": {
1773
+ "version": "2.1.1",
1774
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1775
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1776
+ "dev": true,
1777
+ "license": "MIT",
1778
+ "engines": {
1779
+ "node": ">=0.10.0"
1780
+ }
1781
+ },
1782
+ "node_modules/is-fullwidth-code-point": {
1783
+ "version": "3.0.0",
1784
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1785
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1786
+ "dev": true,
1787
+ "license": "MIT",
1788
+ "engines": {
1789
+ "node": ">=8"
1790
+ }
1791
+ },
1792
+ "node_modules/is-glob": {
1793
+ "version": "4.0.3",
1794
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1795
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1796
+ "dev": true,
1797
+ "license": "MIT",
1798
+ "dependencies": {
1799
+ "is-extglob": "^2.1.1"
1800
+ },
1801
+ "engines": {
1802
+ "node": ">=0.10.0"
1803
+ }
1804
+ },
1805
+ "node_modules/is-number": {
1806
+ "version": "7.0.0",
1807
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1808
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1809
+ "dev": true,
1810
+ "license": "MIT",
1811
+ "engines": {
1812
+ "node": ">=0.12.0"
1813
+ }
1814
+ },
1815
  "node_modules/is-promise": {
1816
  "version": "4.0.0",
1817
  "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
1818
  "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
1819
  "license": "MIT"
1820
  },
1821
+ "node_modules/isarray": {
1822
+ "version": "1.0.0",
1823
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1824
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
1825
+ "dev": true,
1826
+ "license": "MIT"
1827
+ },
1828
+ "node_modules/jsesc": {
1829
+ "version": "2.5.2",
1830
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
1831
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
1832
+ "dev": true,
1833
+ "license": "MIT",
1834
+ "bin": {
1835
+ "jsesc": "bin/jsesc"
1836
+ },
1837
+ "engines": {
1838
+ "node": ">=4"
1839
+ }
1840
+ },
1841
+ "node_modules/jsonfile": {
1842
+ "version": "6.2.0",
1843
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
1844
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
1845
+ "dev": true,
1846
+ "license": "MIT",
1847
+ "dependencies": {
1848
+ "universalify": "^2.0.0"
1849
+ },
1850
+ "optionalDependencies": {
1851
+ "graceful-fs": "^4.1.6"
1852
+ }
1853
+ },
1854
  "node_modules/jsonwebtoken": {
1855
  "version": "9.0.3",
1856
  "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
 
1966
  "url": "https://github.com/sponsors/sindresorhus"
1967
  }
1968
  },
1969
+ "node_modules/merge2": {
1970
+ "version": "1.4.1",
1971
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1972
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1973
+ "dev": true,
1974
+ "license": "MIT",
1975
+ "engines": {
1976
+ "node": ">= 8"
1977
+ }
1978
+ },
1979
+ "node_modules/micromatch": {
1980
+ "version": "4.0.8",
1981
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
1982
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
1983
+ "dev": true,
1984
+ "license": "MIT",
1985
+ "dependencies": {
1986
+ "braces": "^3.0.3",
1987
+ "picomatch": "^2.3.1"
1988
+ },
1989
+ "engines": {
1990
+ "node": ">=8.6"
1991
+ }
1992
+ },
1993
  "node_modules/mime-db": {
1994
  "version": "1.54.0",
1995
  "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
 
2011
  "node": ">= 0.6"
2012
  }
2013
  },
2014
+ "node_modules/mimic-response": {
2015
+ "version": "3.1.0",
2016
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
2017
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
2018
+ "dev": true,
2019
+ "license": "MIT",
2020
+ "engines": {
2021
+ "node": ">=10"
2022
+ },
2023
+ "funding": {
2024
+ "url": "https://github.com/sponsors/sindresorhus"
2025
+ }
2026
+ },
2027
+ "node_modules/minimist": {
2028
+ "version": "1.2.8",
2029
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
2030
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
2031
+ "dev": true,
2032
+ "license": "MIT",
2033
+ "funding": {
2034
+ "url": "https://github.com/sponsors/ljharb"
2035
+ }
2036
+ },
2037
+ "node_modules/mkdirp-classic": {
2038
+ "version": "0.5.3",
2039
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
2040
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
2041
+ "dev": true,
2042
+ "license": "MIT"
2043
+ },
2044
  "node_modules/ms": {
2045
  "version": "2.1.3",
2046
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2047
  "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
2048
  "license": "MIT"
2049
  },
2050
+ "node_modules/multistream": {
2051
+ "version": "4.1.0",
2052
+ "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz",
2053
+ "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==",
2054
+ "dev": true,
2055
+ "funding": [
2056
+ {
2057
+ "type": "github",
2058
+ "url": "https://github.com/sponsors/feross"
2059
+ },
2060
+ {
2061
+ "type": "patreon",
2062
+ "url": "https://www.patreon.com/feross"
2063
+ },
2064
+ {
2065
+ "type": "consulting",
2066
+ "url": "https://feross.org/support"
2067
+ }
2068
+ ],
2069
+ "license": "MIT",
2070
+ "dependencies": {
2071
+ "once": "^1.4.0",
2072
+ "readable-stream": "^3.6.0"
2073
+ }
2074
+ },
2075
+ "node_modules/multistream/node_modules/readable-stream": {
2076
+ "version": "3.6.2",
2077
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
2078
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
2079
+ "dev": true,
2080
+ "license": "MIT",
2081
+ "dependencies": {
2082
+ "inherits": "^2.0.3",
2083
+ "string_decoder": "^1.1.1",
2084
+ "util-deprecate": "^1.0.1"
2085
+ },
2086
+ "engines": {
2087
+ "node": ">= 6"
2088
+ }
2089
+ },
2090
+ "node_modules/napi-build-utils": {
2091
+ "version": "1.0.2",
2092
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
2093
+ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
2094
+ "dev": true,
2095
+ "license": "MIT"
2096
+ },
2097
  "node_modules/negotiator": {
2098
  "version": "1.0.0",
2099
  "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
 
2103
  "node": ">= 0.6"
2104
  }
2105
  },
2106
+ "node_modules/node-abi": {
2107
+ "version": "3.85.0",
2108
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz",
2109
+ "integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==",
2110
+ "dev": true,
2111
+ "license": "MIT",
2112
+ "dependencies": {
2113
+ "semver": "^7.3.5"
2114
+ },
2115
+ "engines": {
2116
+ "node": ">=10"
2117
+ }
2118
+ },
2119
+ "node_modules/node-fetch": {
2120
+ "version": "2.7.0",
2121
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
2122
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
2123
+ "dev": true,
2124
+ "license": "MIT",
2125
+ "dependencies": {
2126
+ "whatwg-url": "^5.0.0"
2127
+ },
2128
+ "engines": {
2129
+ "node": "4.x || >=6.0.0"
2130
+ },
2131
+ "peerDependencies": {
2132
+ "encoding": "^0.1.0"
2133
+ },
2134
+ "peerDependenciesMeta": {
2135
+ "encoding": {
2136
+ "optional": true
2137
+ }
2138
+ }
2139
+ },
2140
  "node_modules/object-assign": {
2141
  "version": "4.1.1",
2142
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 
2179
  "wrappy": "1"
2180
  }
2181
  },
2182
+ "node_modules/p-is-promise": {
2183
+ "version": "3.0.0",
2184
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz",
2185
+ "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==",
2186
+ "dev": true,
2187
+ "license": "MIT",
2188
+ "engines": {
2189
+ "node": ">=8"
2190
+ }
2191
+ },
2192
  "node_modules/parseurl": {
2193
  "version": "1.3.3",
2194
  "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
 
2198
  "node": ">= 0.8"
2199
  }
2200
  },
2201
+ "node_modules/path-parse": {
2202
+ "version": "1.0.7",
2203
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
2204
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
2205
+ "dev": true,
2206
+ "license": "MIT"
2207
+ },
2208
+ "node_modules/path-to-regexp": {
2209
+ "version": "8.3.0",
2210
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
2211
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
2212
+ "license": "MIT",
2213
+ "funding": {
2214
+ "type": "opencollective",
2215
+ "url": "https://opencollective.com/express"
2216
+ }
2217
+ },
2218
+ "node_modules/path-type": {
2219
+ "version": "4.0.0",
2220
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
2221
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
2222
+ "dev": true,
2223
+ "license": "MIT",
2224
+ "engines": {
2225
+ "node": ">=8"
2226
+ }
2227
+ },
2228
+ "node_modules/picomatch": {
2229
+ "version": "2.3.1",
2230
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2231
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2232
+ "dev": true,
2233
+ "license": "MIT",
2234
+ "engines": {
2235
+ "node": ">=8.6"
2236
+ },
2237
+ "funding": {
2238
+ "url": "https://github.com/sponsors/jonschlinkert"
2239
+ }
2240
+ },
2241
+ "node_modules/pkg": {
2242
+ "version": "5.8.1",
2243
+ "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz",
2244
+ "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==",
2245
+ "dev": true,
2246
+ "license": "MIT",
2247
+ "dependencies": {
2248
+ "@babel/generator": "7.18.2",
2249
+ "@babel/parser": "7.18.4",
2250
+ "@babel/types": "7.19.0",
2251
+ "chalk": "^4.1.2",
2252
+ "fs-extra": "^9.1.0",
2253
+ "globby": "^11.1.0",
2254
+ "into-stream": "^6.0.0",
2255
+ "is-core-module": "2.9.0",
2256
+ "minimist": "^1.2.6",
2257
+ "multistream": "^4.1.0",
2258
+ "pkg-fetch": "3.4.2",
2259
+ "prebuild-install": "7.1.1",
2260
+ "resolve": "^1.22.0",
2261
+ "stream-meter": "^1.0.4"
2262
+ },
2263
+ "bin": {
2264
+ "pkg": "lib-es5/bin.js"
2265
+ },
2266
+ "peerDependencies": {
2267
+ "node-notifier": ">=9.0.1"
2268
+ },
2269
+ "peerDependenciesMeta": {
2270
+ "node-notifier": {
2271
+ "optional": true
2272
+ }
2273
+ }
2274
+ },
2275
+ "node_modules/pkg-fetch": {
2276
+ "version": "3.4.2",
2277
+ "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz",
2278
+ "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==",
2279
+ "dev": true,
2280
+ "license": "MIT",
2281
+ "dependencies": {
2282
+ "chalk": "^4.1.2",
2283
+ "fs-extra": "^9.1.0",
2284
+ "https-proxy-agent": "^5.0.0",
2285
+ "node-fetch": "^2.6.6",
2286
+ "progress": "^2.0.3",
2287
+ "semver": "^7.3.5",
2288
+ "tar-fs": "^2.1.1",
2289
+ "yargs": "^16.2.0"
2290
+ },
2291
+ "bin": {
2292
+ "pkg-fetch": "lib-es5/bin.js"
2293
+ }
2294
+ },
2295
+ "node_modules/prebuild-install": {
2296
+ "version": "7.1.1",
2297
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
2298
+ "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
2299
+ "dev": true,
2300
+ "license": "MIT",
2301
+ "dependencies": {
2302
+ "detect-libc": "^2.0.0",
2303
+ "expand-template": "^2.0.3",
2304
+ "github-from-package": "0.0.0",
2305
+ "minimist": "^1.2.3",
2306
+ "mkdirp-classic": "^0.5.3",
2307
+ "napi-build-utils": "^1.0.1",
2308
+ "node-abi": "^3.3.0",
2309
+ "pump": "^3.0.0",
2310
+ "rc": "^1.2.7",
2311
+ "simple-get": "^4.0.0",
2312
+ "tar-fs": "^2.0.0",
2313
+ "tunnel-agent": "^0.6.0"
2314
+ },
2315
+ "bin": {
2316
+ "prebuild-install": "bin.js"
2317
+ },
2318
+ "engines": {
2319
+ "node": ">=10"
2320
+ }
2321
+ },
2322
+ "node_modules/process-nextick-args": {
2323
+ "version": "2.0.1",
2324
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
2325
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
2326
+ "dev": true,
2327
+ "license": "MIT"
2328
+ },
2329
+ "node_modules/progress": {
2330
+ "version": "2.0.3",
2331
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
2332
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
2333
+ "dev": true,
2334
  "license": "MIT",
2335
+ "engines": {
2336
+ "node": ">=0.4.0"
 
2337
  }
2338
  },
2339
  "node_modules/proxy-addr": {
 
2355
  "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
2356
  "license": "MIT"
2357
  },
2358
+ "node_modules/pump": {
2359
+ "version": "3.0.3",
2360
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
2361
+ "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
2362
+ "dev": true,
2363
+ "license": "MIT",
2364
+ "dependencies": {
2365
+ "end-of-stream": "^1.1.0",
2366
+ "once": "^1.3.1"
2367
+ }
2368
+ },
2369
  "node_modules/qs": {
2370
  "version": "6.14.0",
2371
  "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
 
2381
  "url": "https://github.com/sponsors/ljharb"
2382
  }
2383
  },
2384
+ "node_modules/queue-microtask": {
2385
+ "version": "1.2.3",
2386
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2387
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2388
+ "dev": true,
2389
+ "funding": [
2390
+ {
2391
+ "type": "github",
2392
+ "url": "https://github.com/sponsors/feross"
2393
+ },
2394
+ {
2395
+ "type": "patreon",
2396
+ "url": "https://www.patreon.com/feross"
2397
+ },
2398
+ {
2399
+ "type": "consulting",
2400
+ "url": "https://feross.org/support"
2401
+ }
2402
+ ],
2403
+ "license": "MIT"
2404
+ },
2405
  "node_modules/range-parser": {
2406
  "version": "1.2.1",
2407
  "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
 
2426
  "node": ">= 0.10"
2427
  }
2428
  },
2429
+ "node_modules/rc": {
2430
+ "version": "1.2.8",
2431
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
2432
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
2433
+ "dev": true,
2434
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
2435
+ "dependencies": {
2436
+ "deep-extend": "^0.6.0",
2437
+ "ini": "~1.3.0",
2438
+ "minimist": "^1.2.0",
2439
+ "strip-json-comments": "~2.0.1"
2440
+ },
2441
+ "bin": {
2442
+ "rc": "cli.js"
2443
+ }
2444
+ },
2445
+ "node_modules/readable-stream": {
2446
+ "version": "2.3.8",
2447
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
2448
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
2449
+ "dev": true,
2450
+ "license": "MIT",
2451
+ "dependencies": {
2452
+ "core-util-is": "~1.0.0",
2453
+ "inherits": "~2.0.3",
2454
+ "isarray": "~1.0.0",
2455
+ "process-nextick-args": "~2.0.0",
2456
+ "safe-buffer": "~5.1.1",
2457
+ "string_decoder": "~1.1.1",
2458
+ "util-deprecate": "~1.0.1"
2459
+ }
2460
+ },
2461
+ "node_modules/readable-stream/node_modules/safe-buffer": {
2462
+ "version": "5.1.2",
2463
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2464
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2465
+ "dev": true,
2466
+ "license": "MIT"
2467
+ },
2468
+ "node_modules/require-directory": {
2469
+ "version": "2.1.1",
2470
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
2471
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
2472
+ "dev": true,
2473
+ "license": "MIT",
2474
+ "engines": {
2475
+ "node": ">=0.10.0"
2476
+ }
2477
+ },
2478
+ "node_modules/resolve": {
2479
+ "version": "1.22.11",
2480
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
2481
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
2482
+ "dev": true,
2483
+ "license": "MIT",
2484
+ "dependencies": {
2485
+ "is-core-module": "^2.16.1",
2486
+ "path-parse": "^1.0.7",
2487
+ "supports-preserve-symlinks-flag": "^1.0.0"
2488
+ },
2489
+ "bin": {
2490
+ "resolve": "bin/resolve"
2491
+ },
2492
+ "engines": {
2493
+ "node": ">= 0.4"
2494
+ },
2495
+ "funding": {
2496
+ "url": "https://github.com/sponsors/ljharb"
2497
+ }
2498
+ },
2499
+ "node_modules/resolve/node_modules/is-core-module": {
2500
+ "version": "2.16.1",
2501
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
2502
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
2503
+ "dev": true,
2504
+ "license": "MIT",
2505
+ "dependencies": {
2506
+ "hasown": "^2.0.2"
2507
+ },
2508
+ "engines": {
2509
+ "node": ">= 0.4"
2510
+ },
2511
+ "funding": {
2512
+ "url": "https://github.com/sponsors/ljharb"
2513
+ }
2514
+ },
2515
+ "node_modules/reusify": {
2516
+ "version": "1.1.0",
2517
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
2518
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
2519
+ "dev": true,
2520
+ "license": "MIT",
2521
+ "engines": {
2522
+ "iojs": ">=1.0.0",
2523
+ "node": ">=0.10.0"
2524
+ }
2525
+ },
2526
  "node_modules/router": {
2527
  "version": "2.2.0",
2528
  "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
 
2539
  "node": ">= 18"
2540
  }
2541
  },
2542
+ "node_modules/run-parallel": {
2543
+ "version": "1.2.0",
2544
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2545
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2546
+ "dev": true,
2547
+ "funding": [
2548
+ {
2549
+ "type": "github",
2550
+ "url": "https://github.com/sponsors/feross"
2551
+ },
2552
+ {
2553
+ "type": "patreon",
2554
+ "url": "https://www.patreon.com/feross"
2555
+ },
2556
+ {
2557
+ "type": "consulting",
2558
+ "url": "https://feross.org/support"
2559
+ }
2560
+ ],
2561
+ "license": "MIT",
2562
+ "dependencies": {
2563
+ "queue-microtask": "^1.2.2"
2564
+ }
2565
+ },
2566
  "node_modules/safe-buffer": {
2567
  "version": "5.2.1",
2568
  "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
 
2716
  "url": "https://github.com/sponsors/ljharb"
2717
  }
2718
  },
2719
+ "node_modules/simple-concat": {
2720
+ "version": "1.0.1",
2721
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
2722
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
2723
+ "dev": true,
2724
+ "funding": [
2725
+ {
2726
+ "type": "github",
2727
+ "url": "https://github.com/sponsors/feross"
2728
+ },
2729
+ {
2730
+ "type": "patreon",
2731
+ "url": "https://www.patreon.com/feross"
2732
+ },
2733
+ {
2734
+ "type": "consulting",
2735
+ "url": "https://feross.org/support"
2736
+ }
2737
+ ],
2738
+ "license": "MIT"
2739
+ },
2740
+ "node_modules/simple-get": {
2741
+ "version": "4.0.1",
2742
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
2743
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
2744
+ "dev": true,
2745
+ "funding": [
2746
+ {
2747
+ "type": "github",
2748
+ "url": "https://github.com/sponsors/feross"
2749
+ },
2750
+ {
2751
+ "type": "patreon",
2752
+ "url": "https://www.patreon.com/feross"
2753
+ },
2754
+ {
2755
+ "type": "consulting",
2756
+ "url": "https://feross.org/support"
2757
+ }
2758
+ ],
2759
+ "license": "MIT",
2760
+ "dependencies": {
2761
+ "decompress-response": "^6.0.0",
2762
+ "once": "^1.3.1",
2763
+ "simple-concat": "^1.0.0"
2764
+ }
2765
+ },
2766
+ "node_modules/slash": {
2767
+ "version": "3.0.0",
2768
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
2769
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
2770
+ "dev": true,
2771
+ "license": "MIT",
2772
+ "engines": {
2773
+ "node": ">=8"
2774
+ }
2775
+ },
2776
  "node_modules/statuses": {
2777
  "version": "2.0.2",
2778
  "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
 
2782
  "node": ">= 0.8"
2783
  }
2784
  },
2785
+ "node_modules/stream-meter": {
2786
+ "version": "1.0.4",
2787
+ "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz",
2788
+ "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==",
2789
+ "dev": true,
2790
+ "license": "MIT",
2791
+ "dependencies": {
2792
+ "readable-stream": "^2.1.4"
2793
+ }
2794
+ },
2795
+ "node_modules/string_decoder": {
2796
+ "version": "1.1.1",
2797
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2798
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2799
+ "dev": true,
2800
+ "license": "MIT",
2801
+ "dependencies": {
2802
+ "safe-buffer": "~5.1.0"
2803
+ }
2804
+ },
2805
+ "node_modules/string_decoder/node_modules/safe-buffer": {
2806
+ "version": "5.1.2",
2807
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2808
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2809
+ "dev": true,
2810
+ "license": "MIT"
2811
+ },
2812
+ "node_modules/string-width": {
2813
+ "version": "4.2.3",
2814
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2815
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2816
+ "dev": true,
2817
+ "license": "MIT",
2818
+ "dependencies": {
2819
+ "emoji-regex": "^8.0.0",
2820
+ "is-fullwidth-code-point": "^3.0.0",
2821
+ "strip-ansi": "^6.0.1"
2822
+ },
2823
+ "engines": {
2824
+ "node": ">=8"
2825
+ }
2826
+ },
2827
+ "node_modules/strip-ansi": {
2828
+ "version": "6.0.1",
2829
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2830
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2831
+ "dev": true,
2832
+ "license": "MIT",
2833
+ "dependencies": {
2834
+ "ansi-regex": "^5.0.1"
2835
+ },
2836
+ "engines": {
2837
+ "node": ">=8"
2838
+ }
2839
+ },
2840
+ "node_modules/strip-json-comments": {
2841
+ "version": "2.0.1",
2842
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
2843
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
2844
+ "dev": true,
2845
+ "license": "MIT",
2846
+ "engines": {
2847
+ "node": ">=0.10.0"
2848
+ }
2849
+ },
2850
+ "node_modules/supports-color": {
2851
+ "version": "7.2.0",
2852
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2853
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2854
+ "dev": true,
2855
+ "license": "MIT",
2856
+ "dependencies": {
2857
+ "has-flag": "^4.0.0"
2858
+ },
2859
+ "engines": {
2860
+ "node": ">=8"
2861
+ }
2862
+ },
2863
+ "node_modules/supports-preserve-symlinks-flag": {
2864
+ "version": "1.0.0",
2865
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2866
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2867
+ "dev": true,
2868
+ "license": "MIT",
2869
+ "engines": {
2870
+ "node": ">= 0.4"
2871
+ },
2872
+ "funding": {
2873
+ "url": "https://github.com/sponsors/ljharb"
2874
+ }
2875
+ },
2876
+ "node_modules/tar-fs": {
2877
+ "version": "2.1.4",
2878
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz",
2879
+ "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==",
2880
+ "dev": true,
2881
+ "license": "MIT",
2882
+ "dependencies": {
2883
+ "chownr": "^1.1.1",
2884
+ "mkdirp-classic": "^0.5.2",
2885
+ "pump": "^3.0.0",
2886
+ "tar-stream": "^2.1.4"
2887
+ }
2888
+ },
2889
+ "node_modules/tar-stream": {
2890
+ "version": "2.2.0",
2891
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
2892
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
2893
+ "dev": true,
2894
+ "license": "MIT",
2895
+ "dependencies": {
2896
+ "bl": "^4.0.3",
2897
+ "end-of-stream": "^1.4.1",
2898
+ "fs-constants": "^1.0.0",
2899
+ "inherits": "^2.0.3",
2900
+ "readable-stream": "^3.1.1"
2901
+ },
2902
+ "engines": {
2903
+ "node": ">=6"
2904
+ }
2905
+ },
2906
+ "node_modules/tar-stream/node_modules/readable-stream": {
2907
+ "version": "3.6.2",
2908
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
2909
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
2910
+ "dev": true,
2911
+ "license": "MIT",
2912
+ "dependencies": {
2913
+ "inherits": "^2.0.3",
2914
+ "string_decoder": "^1.1.1",
2915
+ "util-deprecate": "^1.0.1"
2916
+ },
2917
+ "engines": {
2918
+ "node": ">= 6"
2919
+ }
2920
+ },
2921
+ "node_modules/to-fast-properties": {
2922
+ "version": "2.0.0",
2923
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
2924
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
2925
+ "dev": true,
2926
+ "license": "MIT",
2927
+ "engines": {
2928
+ "node": ">=4"
2929
+ }
2930
+ },
2931
+ "node_modules/to-regex-range": {
2932
+ "version": "5.0.1",
2933
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2934
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2935
+ "dev": true,
2936
+ "license": "MIT",
2937
+ "dependencies": {
2938
+ "is-number": "^7.0.0"
2939
+ },
2940
+ "engines": {
2941
+ "node": ">=8.0"
2942
+ }
2943
+ },
2944
  "node_modules/toidentifier": {
2945
  "version": "1.0.1",
2946
  "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
 
2950
  "node": ">=0.6"
2951
  }
2952
  },
2953
+ "node_modules/tr46": {
2954
+ "version": "0.0.3",
2955
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
2956
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
2957
+ "dev": true,
2958
+ "license": "MIT"
2959
+ },
2960
+ "node_modules/tunnel-agent": {
2961
+ "version": "0.6.0",
2962
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
2963
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
2964
+ "dev": true,
2965
+ "license": "Apache-2.0",
2966
+ "dependencies": {
2967
+ "safe-buffer": "^5.0.1"
2968
+ },
2969
+ "engines": {
2970
+ "node": "*"
2971
+ }
2972
+ },
2973
  "node_modules/type-is": {
2974
  "version": "2.0.1",
2975
  "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
 
2984
  "node": ">= 0.6"
2985
  }
2986
  },
2987
+ "node_modules/universalify": {
2988
+ "version": "2.0.1",
2989
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
2990
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
2991
+ "dev": true,
2992
+ "license": "MIT",
2993
+ "engines": {
2994
+ "node": ">= 10.0.0"
2995
+ }
2996
+ },
2997
  "node_modules/unpipe": {
2998
  "version": "1.0.0",
2999
  "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
 
3003
  "node": ">= 0.8"
3004
  }
3005
  },
3006
+ "node_modules/util-deprecate": {
3007
+ "version": "1.0.2",
3008
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3009
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
3010
+ "dev": true,
3011
+ "license": "MIT"
3012
+ },
3013
  "node_modules/vary": {
3014
  "version": "1.1.2",
3015
  "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
 
3019
  "node": ">= 0.8"
3020
  }
3021
  },
3022
+ "node_modules/webidl-conversions": {
3023
+ "version": "3.0.1",
3024
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
3025
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
3026
+ "dev": true,
3027
+ "license": "BSD-2-Clause"
3028
+ },
3029
+ "node_modules/whatwg-url": {
3030
+ "version": "5.0.0",
3031
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
3032
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
3033
+ "dev": true,
3034
+ "license": "MIT",
3035
+ "dependencies": {
3036
+ "tr46": "~0.0.3",
3037
+ "webidl-conversions": "^3.0.0"
3038
+ }
3039
+ },
3040
+ "node_modules/wrap-ansi": {
3041
+ "version": "7.0.0",
3042
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
3043
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
3044
+ "dev": true,
3045
+ "license": "MIT",
3046
+ "dependencies": {
3047
+ "ansi-styles": "^4.0.0",
3048
+ "string-width": "^4.1.0",
3049
+ "strip-ansi": "^6.0.0"
3050
+ },
3051
+ "engines": {
3052
+ "node": ">=10"
3053
+ },
3054
+ "funding": {
3055
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3056
+ }
3057
+ },
3058
  "node_modules/wrappy": {
3059
  "version": "1.0.2",
3060
  "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3061
  "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
3062
  "license": "ISC"
3063
+ },
3064
+ "node_modules/y18n": {
3065
+ "version": "5.0.8",
3066
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
3067
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
3068
+ "dev": true,
3069
+ "license": "ISC",
3070
+ "engines": {
3071
+ "node": ">=10"
3072
+ }
3073
+ },
3074
+ "node_modules/yargs": {
3075
+ "version": "16.2.0",
3076
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
3077
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
3078
+ "dev": true,
3079
+ "license": "MIT",
3080
+ "dependencies": {
3081
+ "cliui": "^7.0.2",
3082
+ "escalade": "^3.1.1",
3083
+ "get-caller-file": "^2.0.5",
3084
+ "require-directory": "^2.1.1",
3085
+ "string-width": "^4.2.0",
3086
+ "y18n": "^5.0.5",
3087
+ "yargs-parser": "^20.2.2"
3088
+ },
3089
+ "engines": {
3090
+ "node": ">=10"
3091
+ }
3092
+ },
3093
+ "node_modules/yargs-parser": {
3094
+ "version": "20.2.9",
3095
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
3096
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
3097
+ "dev": true,
3098
+ "license": "ISC",
3099
+ "engines": {
3100
+ "node": ">=10"
3101
+ }
3102
  }
3103
  }
3104
  }
package.json CHANGED
@@ -4,12 +4,20 @@
4
  "description": "Antigravity API 转 OpenAI 格式的代理服务",
5
  "type": "module",
6
  "main": "src/server/index.js",
 
7
  "scripts": {
8
  "start": "node --expose-gc src/server/index.js",
9
  "start:no-gc": "node src/server/index.js",
10
  "login": "node scripts/oauth-server.js",
11
  "refresh": "node scripts/refresh-tokens.js",
12
- "dev": "node --expose-gc --watch src/server/index.js"
 
 
 
 
 
 
 
13
  },
14
  "keywords": [
15
  "antigravity",
@@ -26,7 +34,31 @@
26
  "express": "^5.2.1",
27
  "jsonwebtoken": "^9.0.3"
28
  },
 
 
 
 
29
  "engines": {
30
  "node": ">=18.0.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  }
32
  }
 
4
  "description": "Antigravity API 转 OpenAI 格式的代理服务",
5
  "type": "module",
6
  "main": "src/server/index.js",
7
+ "bin": "src/server/index.js",
8
  "scripts": {
9
  "start": "node --expose-gc src/server/index.js",
10
  "start:no-gc": "node src/server/index.js",
11
  "login": "node scripts/oauth-server.js",
12
  "refresh": "node scripts/refresh-tokens.js",
13
+ "dev": "node --expose-gc --watch src/server/index.js",
14
+ "build": "node scripts/build.js --target=win",
15
+ "build:win": "node scripts/build.js --target=win",
16
+ "build:linux": "node scripts/build.js --target=linux",
17
+ "build:linux-arm64": "node scripts/build.js --target=linux-arm64",
18
+ "build:macos": "node scripts/build.js --target=macos",
19
+ "build:macos-arm64": "node scripts/build.js --target=macos-arm64",
20
+ "build:all": "node scripts/build.js --target=all"
21
  },
22
  "keywords": [
23
  "antigravity",
 
34
  "express": "^5.2.1",
35
  "jsonwebtoken": "^9.0.3"
36
  },
37
+ "devDependencies": {
38
+ "esbuild": "^0.27.2",
39
+ "pkg": "^5.8.1"
40
+ },
41
  "engines": {
42
  "node": ">=18.0.0"
43
+ },
44
+ "pkg": {
45
+ "scripts": [
46
+ "src/**/*.js",
47
+ "scripts/**/*.js"
48
+ ],
49
+ "assets": [
50
+ "public/**/*",
51
+ "src/bin/**/*",
52
+ ".env.example",
53
+ "config.json"
54
+ ],
55
+ "targets": [
56
+ "node18-win-x64",
57
+ "node18-linux-x64",
58
+ "node18-linux-arm64",
59
+ "node18-macos-x64",
60
+ "node18-macos-arm64"
61
+ ],
62
+ "outputPath": "dist"
63
  }
64
  }
scripts/build.js ADDED
@@ -0,0 +1,251 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import esbuild from 'esbuild';
2
+ import { execSync } from 'child_process';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ const rootDir = path.join(__dirname, '..');
9
+ const distDir = path.join(rootDir, 'dist');
10
+ const bundleDir = path.join(distDir, 'bundle');
11
+
12
+ // 转换为正斜杠路径(跨平台兼容)
13
+ const toSlash = (p) => p.replace(/\\/g, '/');
14
+
15
+ // 确保目录存在
16
+ if (!fs.existsSync(distDir)) {
17
+ fs.mkdirSync(distDir, { recursive: true });
18
+ }
19
+ if (!fs.existsSync(bundleDir)) {
20
+ fs.mkdirSync(bundleDir, { recursive: true });
21
+ }
22
+
23
+ // 获取命令行参数
24
+ const args = process.argv.slice(2);
25
+ const targetArg = args.find(arg => arg.startsWith('--target='));
26
+ const target = targetArg ? targetArg.split('=')[1] : 'node18-win-x64';
27
+
28
+ // 解析目标平台
29
+ const targetMap = {
30
+ 'win': 'node18-win-x64',
31
+ 'win-x64': 'node18-win-x64',
32
+ 'linux': 'node18-linux-x64',
33
+ 'linux-x64': 'node18-linux-x64',
34
+ 'linux-arm64': 'node18-linux-arm64',
35
+ 'macos': 'node18-macos-x64',
36
+ 'macos-x64': 'node18-macos-x64',
37
+ 'macos-arm64': 'node18-macos-arm64',
38
+ 'all': 'node18-win-x64,node18-linux-x64,node18-linux-arm64,node18-macos-x64,node18-macos-arm64'
39
+ };
40
+
41
+ const resolvedTarget = targetMap[target] || target;
42
+
43
+ // 输出文件名映射
44
+ const outputNameMap = {
45
+ 'node18-win-x64': 'antigravity-win-x64.exe',
46
+ 'node18-linux-x64': 'antigravity-linux-x64',
47
+ 'node18-linux-arm64': 'antigravity-linux-arm64',
48
+ 'node18-macos-x64': 'antigravity-macos-x64',
49
+ 'node18-macos-arm64': 'antigravity-macos-arm64'
50
+ };
51
+
52
+ console.log('📦 Step 1: Bundling with esbuild...');
53
+
54
+ // 使用 esbuild 打包成 CommonJS
55
+ await esbuild.build({
56
+ entryPoints: ['src/server/index.js'],
57
+ bundle: true,
58
+ platform: 'node',
59
+ target: 'node18',
60
+ format: 'cjs',
61
+ outfile: path.join(bundleDir, 'server.cjs'),
62
+ external: [],
63
+ minify: false,
64
+ sourcemap: false,
65
+ // 处理 __dirname 和 __filename
66
+ define: {
67
+ 'import.meta.url': 'importMetaUrl'
68
+ },
69
+ banner: {
70
+ js: `
71
+ const importMetaUrl = require('url').pathToFileURL(__filename).href;
72
+ const __importMetaDirname = __dirname;
73
+ `
74
+ },
75
+ // 复制静态资源
76
+ loader: {
77
+ '.node': 'copy'
78
+ }
79
+ });
80
+
81
+ console.log('✅ Bundle created: dist/bundle/server.cjs');
82
+
83
+ // 创建临时 package.json 用于 pkg
84
+ // 使用绝对路径引用资源文件
85
+ const pkgJson = {
86
+ name: 'antigravity-to-openai',
87
+ version: '1.0.0',
88
+ bin: 'server.cjs',
89
+ pkg: {
90
+ assets: [
91
+ toSlash(path.join(rootDir, 'public', '*.html')),
92
+ toSlash(path.join(rootDir, 'public', '*.js')),
93
+ toSlash(path.join(rootDir, 'public', '*.css')),
94
+ toSlash(path.join(rootDir, 'src', 'bin', '*'))
95
+ ]
96
+ }
97
+ };
98
+
99
+ fs.writeFileSync(
100
+ path.join(bundleDir, 'package.json'),
101
+ JSON.stringify(pkgJson, null, 2)
102
+ );
103
+
104
+ console.log('📦 Step 2: Building executable with pkg...');
105
+
106
+ // 执行 pkg 命令的辅助函数
107
+ function runPkg(args) {
108
+ // 将参数中的路径转换为正斜杠格式
109
+ const quotedArgs = args.map(arg => {
110
+ if (arg.includes(' ') || arg.includes('\\')) {
111
+ return `"${arg.replace(/\\/g, '/')}"`;
112
+ }
113
+ return arg;
114
+ });
115
+
116
+ const cmd = `npx pkg ${quotedArgs.join(' ')}`;
117
+ console.log(`Running: ${cmd}`);
118
+
119
+ try {
120
+ execSync(cmd, {
121
+ cwd: rootDir,
122
+ stdio: 'inherit',
123
+ shell: true
124
+ });
125
+ } catch (error) {
126
+ throw new Error(`pkg failed: ${error.message}`);
127
+ }
128
+ }
129
+
130
+ // 构建 pkg 命令
131
+ const targets = resolvedTarget.split(',');
132
+ const isMultiTarget = targets.length > 1;
133
+
134
+ try {
135
+ const pkgJsonPath = path.join(bundleDir, 'package.json');
136
+
137
+ // 删除旧的可执行文件(避免 EPERM 错误)
138
+ if (isMultiTarget) {
139
+ for (const t of targets) {
140
+ const oldFile = path.join(distDir, outputNameMap[t] || 'antigravity');
141
+ if (fs.existsSync(oldFile)) {
142
+ console.log(`🗑️ Removing old file: ${oldFile}`);
143
+ fs.unlinkSync(oldFile);
144
+ }
145
+ }
146
+ } else {
147
+ const outputName = outputNameMap[resolvedTarget] || 'antigravity';
148
+ const oldFile = path.join(distDir, outputName);
149
+ if (fs.existsSync(oldFile)) {
150
+ console.log(`🗑️ Removing old file: ${oldFile}`);
151
+ fs.unlinkSync(oldFile);
152
+ }
153
+ }
154
+
155
+ if (isMultiTarget) {
156
+ // 多目标构建
157
+ runPkg([pkgJsonPath, '--target', resolvedTarget, '--compress', 'GZip', '--out-path', distDir]);
158
+ } else {
159
+ // 单目标构建
160
+ const outputName = outputNameMap[resolvedTarget] || 'antigravity';
161
+ const outputPath = path.join(distDir, outputName);
162
+
163
+ // ARM64 在 Windows 上交叉编译时禁用压缩(避免 spawn UNKNOWN 错误)
164
+ const isArm64 = resolvedTarget.includes('arm64');
165
+ const isWindows = process.platform === 'win32';
166
+ const compressArgs = (isArm64 && isWindows) ? [] : ['--compress', 'GZip'];
167
+
168
+ runPkg([pkgJsonPath, '--target', resolvedTarget, ...compressArgs, '--output', outputPath]);
169
+ }
170
+
171
+ console.log('✅ Build complete!');
172
+
173
+ // 复制运行时需要的文件到 dist 目录
174
+ console.log('📁 Copying runtime files...');
175
+
176
+ // 复制 public 目录(排除 images)
177
+ const publicSrcDir = path.join(rootDir, 'public');
178
+ const publicDestDir = path.join(distDir, 'public');
179
+ if (fs.existsSync(publicSrcDir)) {
180
+ if (fs.existsSync(publicDestDir)) {
181
+ fs.rmSync(publicDestDir, { recursive: true, force: true });
182
+ }
183
+ fs.mkdirSync(publicDestDir, { recursive: true });
184
+ const publicFiles = fs.readdirSync(publicSrcDir);
185
+ for (const file of publicFiles) {
186
+ if (file === 'images') continue; // 跳过 images 目录
187
+ const srcPath = path.join(publicSrcDir, file);
188
+ const destPath = path.join(publicDestDir, file);
189
+ const stat = fs.statSync(srcPath);
190
+ if (stat.isFile()) {
191
+ fs.copyFileSync(srcPath, destPath);
192
+ } else if (stat.isDirectory()) {
193
+ fs.cpSync(srcPath, destPath, { recursive: true });
194
+ }
195
+ }
196
+ console.log(' ✓ Copied public directory');
197
+ }
198
+
199
+ // 复制 bin 目录(使用系统命令,因为 fs.cpSync 可能在大文件上失败)
200
+ const binSrcDir = path.join(rootDir, 'src', 'bin');
201
+ const binDestDir = path.join(distDir, 'bin');
202
+ if (fs.existsSync(binSrcDir)) {
203
+ if (fs.existsSync(binDestDir)) {
204
+ fs.rmSync(binDestDir, { recursive: true, force: true });
205
+ }
206
+ fs.mkdirSync(binDestDir, { recursive: true });
207
+
208
+ // 使用系统命令复制
209
+ try {
210
+ if (process.platform === 'win32') {
211
+ execSync(`xcopy /E /I /Y "${binSrcDir}" "${binDestDir}"`, { stdio: 'pipe', shell: true });
212
+ } else {
213
+ execSync(`cp -r "${binSrcDir}"/* "${binDestDir}/"`, { stdio: 'pipe', shell: true });
214
+ }
215
+ console.log(' ✓ Copied bin directory');
216
+ } catch (err) {
217
+ console.error(' ⚠ Warning: Failed to copy bin directory:', err.message);
218
+ console.log(' Please manually copy src/bin to dist/bin');
219
+ }
220
+ }
221
+
222
+ // 复制配置文件模板
223
+ const configFiles = ['.env.example', 'config.json'];
224
+ for (const file of configFiles) {
225
+ const srcPath = path.join(rootDir, file);
226
+ const destPath = path.join(distDir, file);
227
+ if (fs.existsSync(srcPath)) {
228
+ fs.copyFileSync(srcPath, destPath);
229
+ console.log(` ✓ Copied ${file}`);
230
+ }
231
+ }
232
+
233
+ console.log('');
234
+ console.log('🎉 Build successful!');
235
+ console.log('');
236
+ console.log('📋 Usage:');
237
+ console.log(' 1. Copy the dist folder to your target machine');
238
+ console.log(' 2. Rename .env.example to .env and configure it');
239
+ console.log(' 3. Run the executable');
240
+ console.log('');
241
+
242
+ } catch (error) {
243
+ console.error('❌ Build failed:', error.message);
244
+ process.exit(1);
245
+ } finally {
246
+ // 清理临时文件
247
+ if (fs.existsSync(bundleDir)) {
248
+ fs.rmSync(bundleDir, { recursive: true, force: true });
249
+ console.log('🧹 Cleaned up temporary files');
250
+ }
251
+ }
src/AntigravityRequester.js CHANGED
@@ -6,6 +6,9 @@ import fs from 'fs';
6
 
7
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
 
 
 
 
9
  // 缓冲区大小警告阈值(不限制,只警告)
10
  const BUFFER_WARNING_SIZE = 50 * 1024 * 1024; // 50MB 警告
11
 
@@ -32,12 +35,46 @@ class antigravityRequester {
32
  filename = 'antigravity_requester_android_arm64';
33
  } else if (platform === 'linux' && arch === "x64") {
34
  filename = 'antigravity_requester_linux_amd64';
 
 
 
35
  } else {
36
  throw new Error(`Unsupported platform: ${platform}+${arch}`);
37
  }
38
 
39
- const binPath = this.binPath || path.join(__dirname, 'bin');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  const requester_execPath = path.join(binPath, filename);
 
 
 
 
 
 
41
  // 设置执行权限(非Windows平台)
42
  if (platform !== 'win32') {
43
  try {
 
6
 
7
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
 
9
+ // 检测是否在 pkg 打包环境中运行
10
+ const isPkg = typeof process.pkg !== 'undefined';
11
+
12
  // 缓冲区大小警告阈值(不限制,只警告)
13
  const BUFFER_WARNING_SIZE = 50 * 1024 * 1024; // 50MB 警告
14
 
 
35
  filename = 'antigravity_requester_android_arm64';
36
  } else if (platform === 'linux' && arch === "x64") {
37
  filename = 'antigravity_requester_linux_amd64';
38
+ } else if (platform === 'linux' && arch === "arm64") {
39
+ // Linux ARM64 (Termux, Raspberry Pi, etc.)
40
+ filename = 'antigravity_requester_android_arm64';
41
  } else {
42
  throw new Error(`Unsupported platform: ${platform}+${arch}`);
43
  }
44
 
45
+ // 获取 bin 目录路径
46
+ // pkg 环境下优先使用可执行文件旁边的 bin 目录
47
+ let binPath = this.binPath;
48
+ if (!binPath) {
49
+ if (isPkg) {
50
+ // pkg 环境:优先使用可执行文件旁边的 bin 目录
51
+ const exeDir = path.dirname(process.execPath);
52
+ const exeBinDir = path.join(exeDir, 'bin');
53
+ if (fs.existsSync(exeBinDir)) {
54
+ binPath = exeBinDir;
55
+ } else {
56
+ // 其次使用当前工作目录的 bin 目录
57
+ const cwdBinDir = path.join(process.cwd(), 'bin');
58
+ if (fs.existsSync(cwdBinDir)) {
59
+ binPath = cwdBinDir;
60
+ } else {
61
+ // 最后使用打包内的 bin 目录
62
+ binPath = path.join(__dirname, 'bin');
63
+ }
64
+ }
65
+ } else {
66
+ // 开发环境
67
+ binPath = path.join(__dirname, 'bin');
68
+ }
69
+ }
70
+
71
  const requester_execPath = path.join(binPath, filename);
72
+
73
+ // 检查文件是否存在
74
+ if (!fs.existsSync(requester_execPath)) {
75
+ console.warn(`Binary not found at: ${requester_execPath}`);
76
+ }
77
+
78
  // 设置执行权限(非Windows平台)
79
  if (platform !== 'win32') {
80
  try {
src/auth/quota_manager.js CHANGED
@@ -7,8 +7,20 @@ import memoryManager, { MemoryPressure } from '../utils/memoryManager.js';
7
  const __filename = fileURLToPath(import.meta.url);
8
  const __dirname = path.dirname(__filename);
9
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  class QuotaManager {
11
- constructor(filePath = path.join(__dirname, '..', '..', 'data', 'quotas.json')) {
12
  this.filePath = filePath;
13
  this.cache = new Map();
14
  this.CACHE_TTL = 5 * 60 * 1000; // 5分钟缓存
 
7
  const __filename = fileURLToPath(import.meta.url);
8
  const __dirname = path.dirname(__filename);
9
 
10
+ // 获取数据目录(支持 pkg 打包环境)
11
+ function getDataDir() {
12
+ // 检测是否在 pkg 打包环境中运行
13
+ if (process.pkg) {
14
+ // pkg 环境:使用可执行文件所在目录的 data 子目录
15
+ const execDir = path.dirname(process.execPath);
16
+ return path.join(execDir, 'data');
17
+ }
18
+ // 普通环境:使用项目根目录的 data 子目录
19
+ return path.join(__dirname, '..', '..', 'data');
20
+ }
21
+
22
  class QuotaManager {
23
+ constructor(filePath = path.join(getDataDir(), 'quotas.json')) {
24
  this.filePath = filePath;
25
  this.cache = new Map();
26
  this.CACHE_TTL = 5 * 60 * 1000; // 5分钟缓存
src/auth/token_manager.js CHANGED
@@ -11,6 +11,44 @@ import { buildAxiosRequestConfig } from '../utils/httpClient.js';
11
  const __filename = fileURLToPath(import.meta.url);
12
  const __dirname = path.dirname(__filename);
13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  // 轮询策略枚举
15
  const RotationStrategy = {
16
  ROUND_ROBIN: 'round_robin', // 均衡负载:每次请求切换
@@ -19,7 +57,7 @@ const RotationStrategy = {
19
  };
20
 
21
  class TokenManager {
22
- constructor(filePath = path.join(__dirname,'..','..','data' ,'accounts.json')) {
23
  this.filePath = filePath;
24
  this.tokens = [];
25
  this.currentIndex = 0;
 
11
  const __filename = fileURLToPath(import.meta.url);
12
  const __dirname = path.dirname(__filename);
13
 
14
+ // 检测是否在 pkg 打包环境中运行
15
+ const isPkg = typeof process.pkg !== 'undefined';
16
+
17
+ // 获取数据目录路径
18
+ // pkg 环境下使用可执行文件所在目录或当前工作目录
19
+ function getDataDir() {
20
+ if (isPkg) {
21
+ // pkg 环境:优先使用可执行文件旁边的 data 目录
22
+ const exeDir = path.dirname(process.execPath);
23
+ const exeDataDir = path.join(exeDir, 'data');
24
+ // 检查是否可以在该目录创建文件
25
+ try {
26
+ if (!fs.existsSync(exeDataDir)) {
27
+ fs.mkdirSync(exeDataDir, { recursive: true });
28
+ }
29
+ return exeDataDir;
30
+ } catch (e) {
31
+ // 如果无法创建,尝试当前工作目录
32
+ const cwdDataDir = path.join(process.cwd(), 'data');
33
+ try {
34
+ if (!fs.existsSync(cwdDataDir)) {
35
+ fs.mkdirSync(cwdDataDir, { recursive: true });
36
+ }
37
+ return cwdDataDir;
38
+ } catch (e2) {
39
+ // 最后使用用户主目录
40
+ const homeDataDir = path.join(process.env.HOME || process.env.USERPROFILE || '.', '.antigravity', 'data');
41
+ if (!fs.existsSync(homeDataDir)) {
42
+ fs.mkdirSync(homeDataDir, { recursive: true });
43
+ }
44
+ return homeDataDir;
45
+ }
46
+ }
47
+ }
48
+ // 开发环境
49
+ return path.join(__dirname, '..', '..', 'data');
50
+ }
51
+
52
  // 轮询策略枚举
53
  const RotationStrategy = {
54
  ROUND_ROBIN: 'round_robin', // 均衡负载:每次请求切换
 
57
  };
58
 
59
  class TokenManager {
60
+ constructor(filePath = path.join(getDataDir(), 'accounts.json')) {
61
  this.filePath = filePath;
62
  this.tokens = [];
63
  this.currentIndex = 0;
src/config/config.js CHANGED
@@ -6,12 +6,60 @@ import log from '../utils/logger.js';
6
 
7
  const __filename = fileURLToPath(import.meta.url);
8
  const __dirname = path.dirname(__filename);
9
- const envPath = path.join(__dirname, '../../.env');
10
- const configJsonPath = path.join(__dirname, '../../config.json');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
  // 确保 .env 存在
13
  if (!fs.existsSync(envPath)) {
14
- const examplePath = path.join(__dirname, '../../.env.example');
15
  if (fs.existsSync(examplePath)) {
16
  fs.copyFileSync(examplePath, envPath);
17
  log.info('✓ 已从 .env.example 创建 .env 文件');
@@ -24,8 +72,8 @@ if (fs.existsSync(configJsonPath)) {
24
  jsonConfig = JSON.parse(fs.readFileSync(configJsonPath, 'utf8'));
25
  }
26
 
27
- // 加载 .env
28
- dotenv.config();
29
 
30
  // 获取代理配置:优先使用 PROXY,其次使用系统代理环境变量
31
  export function getProxyConfig() {
 
6
 
7
  const __filename = fileURLToPath(import.meta.url);
8
  const __dirname = path.dirname(__filename);
9
+
10
+ // 检测是否在 pkg 打包环境中运行
11
+ const isPkg = typeof process.pkg !== 'undefined';
12
+
13
+ // 获取配置文件路径
14
+ // pkg 环境下使用可执行文件所在目录或当前工作目录
15
+ function getConfigPaths() {
16
+ if (isPkg) {
17
+ // pkg 环境:优先使用可执行文件旁边的配置文件
18
+ const exeDir = path.dirname(process.execPath);
19
+ const cwdDir = process.cwd();
20
+
21
+ // 查找 .env 文件
22
+ let envPath = path.join(exeDir, '.env');
23
+ if (!fs.existsSync(envPath)) {
24
+ const cwdEnvPath = path.join(cwdDir, '.env');
25
+ if (fs.existsSync(cwdEnvPath)) {
26
+ envPath = cwdEnvPath;
27
+ }
28
+ }
29
+
30
+ // 查找 config.json 文件
31
+ let configJsonPath = path.join(exeDir, 'config.json');
32
+ if (!fs.existsSync(configJsonPath)) {
33
+ const cwdConfigPath = path.join(cwdDir, 'config.json');
34
+ if (fs.existsSync(cwdConfigPath)) {
35
+ configJsonPath = cwdConfigPath;
36
+ }
37
+ }
38
+
39
+ // 查找 .env.example 文件
40
+ let examplePath = path.join(exeDir, '.env.example');
41
+ if (!fs.existsSync(examplePath)) {
42
+ const cwdExamplePath = path.join(cwdDir, '.env.example');
43
+ if (fs.existsSync(cwdExamplePath)) {
44
+ examplePath = cwdExamplePath;
45
+ }
46
+ }
47
+
48
+ return { envPath, configJsonPath, examplePath };
49
+ }
50
+
51
+ // 开发环境
52
+ return {
53
+ envPath: path.join(__dirname, '../../.env'),
54
+ configJsonPath: path.join(__dirname, '../../config.json'),
55
+ examplePath: path.join(__dirname, '../../.env.example')
56
+ };
57
+ }
58
+
59
+ const { envPath, configJsonPath, examplePath } = getConfigPaths();
60
 
61
  // 确保 .env 存在
62
  if (!fs.existsSync(envPath)) {
 
63
  if (fs.existsSync(examplePath)) {
64
  fs.copyFileSync(examplePath, envPath);
65
  log.info('✓ 已从 .env.example 创建 .env 文件');
 
72
  jsonConfig = JSON.parse(fs.readFileSync(configJsonPath, 'utf8'));
73
  }
74
 
75
+ // 加载 .env(指定路径)
76
+ dotenv.config({ path: envPath });
77
 
78
  // 获取代理配置:优先使用 PROXY,其次使用系统代理环境变量
79
  export function getProxyConfig() {
src/routes/admin.js CHANGED
@@ -1,4 +1,5 @@
1
  import express from 'express';
 
2
  import { generateToken, authMiddleware } from '../auth/jwt.js';
3
  import tokenManager from '../auth/token_manager.js';
4
  import quotaManager from '../auth/quota_manager.js';
@@ -16,7 +17,33 @@ import dotenv from 'dotenv';
16
 
17
  const __filename = fileURLToPath(import.meta.url);
18
  const __dirname = path.dirname(__filename);
19
- const envPath = path.join(__dirname, '../../.env');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
  const router = express.Router();
22
 
 
1
  import express from 'express';
2
+ import fs from 'fs';
3
  import { generateToken, authMiddleware } from '../auth/jwt.js';
4
  import tokenManager from '../auth/token_manager.js';
5
  import quotaManager from '../auth/quota_manager.js';
 
17
 
18
  const __filename = fileURLToPath(import.meta.url);
19
  const __dirname = path.dirname(__filename);
20
+
21
+ // 检测是否在 pkg 打包环境中运行
22
+ const isPkg = typeof process.pkg !== 'undefined';
23
+
24
+ // 获取 .env 文件路径
25
+ // pkg 环境下使用可执行文件所在目录或当前工作目录
26
+ function getEnvPath() {
27
+ if (isPkg) {
28
+ // pkg 环境:优先使用可执行文件旁边的 .env
29
+ const exeDir = path.dirname(process.execPath);
30
+ const exeEnvPath = path.join(exeDir, '.env');
31
+ if (fs.existsSync(exeEnvPath)) {
32
+ return exeEnvPath;
33
+ }
34
+ // 其次使用当前工作目录的 .env
35
+ const cwdEnvPath = path.join(process.cwd(), '.env');
36
+ if (fs.existsSync(cwdEnvPath)) {
37
+ return cwdEnvPath;
38
+ }
39
+ // 返回可执行文件目录的路径(即使不存在)
40
+ return exeEnvPath;
41
+ }
42
+ // 开发环境
43
+ return path.join(__dirname, '../../.env');
44
+ }
45
+
46
+ const envPath = getEnvPath();
47
 
48
  const router = express.Router();
49
 
src/server/index.js CHANGED
@@ -1,6 +1,7 @@
1
  import express from 'express';
2
  import cors from 'cors';
3
  import path from 'path';
 
4
  import { fileURLToPath } from 'url';
5
  import { generateAssistantResponse, generateAssistantResponseNoStream, getAvailableModels, generateImageForSD, closeRequester } from '../api/client.js';
6
  import { generateRequestBody, prepareImageRequest } from '../utils/utils.js';
@@ -14,6 +15,51 @@ import memoryManager, { MemoryPressure, registerMemoryPoolCleanup } from '../uti
14
  const __filename = fileURLToPath(import.meta.url);
15
  const __dirname = path.dirname(__filename);
16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  const app = express();
18
 
19
  // ==================== 通用重试工具(处理 429) ====================
@@ -160,8 +206,8 @@ app.use(cors());
160
  app.use(express.json({ limit: config.security.maxRequestSize }));
161
 
162
  // 静态文件服务
163
- app.use('/images', express.static(path.join(__dirname, '../../public/images')));
164
- app.use(express.static(path.join(__dirname, '../../public')));
165
 
166
  // 管理路由
167
  app.use('/admin', adminRouter);
 
1
  import express from 'express';
2
  import cors from 'cors';
3
  import path from 'path';
4
+ import fs from 'fs';
5
  import { fileURLToPath } from 'url';
6
  import { generateAssistantResponse, generateAssistantResponseNoStream, getAvailableModels, generateImageForSD, closeRequester } from '../api/client.js';
7
  import { generateRequestBody, prepareImageRequest } from '../utils/utils.js';
 
15
  const __filename = fileURLToPath(import.meta.url);
16
  const __dirname = path.dirname(__filename);
17
 
18
+ // 检测是否在 pkg 打包环境中运行
19
+ const isPkg = typeof process.pkg !== 'undefined';
20
+
21
+ // 获取静态文件目录
22
+ // pkg 环境下使用可执行文件所在目录的 public 文件夹
23
+ // 开发环境下使用项目根目录的 public 文件夹
24
+ function getPublicDir() {
25
+ if (isPkg) {
26
+ // pkg 环境:优先使用可执行文件旁边的 public 目录
27
+ const exeDir = path.dirname(process.execPath);
28
+ const exePublicDir = path.join(exeDir, 'public');
29
+ if (fs.existsSync(exePublicDir)) {
30
+ return exePublicDir;
31
+ }
32
+ // 其次使用当前工作目录的 public 目录
33
+ const cwdPublicDir = path.join(process.cwd(), 'public');
34
+ if (fs.existsSync(cwdPublicDir)) {
35
+ return cwdPublicDir;
36
+ }
37
+ // 最后使用打包内的 public 目录(通过 snapshot)
38
+ return path.join(__dirname, '../../public');
39
+ }
40
+ // 开发环境
41
+ return path.join(__dirname, '../../public');
42
+ }
43
+
44
+ const publicDir = getPublicDir();
45
+
46
+ // 计算相对路径用于日志显示
47
+ function getRelativePath(absolutePath) {
48
+ if (isPkg) {
49
+ const exeDir = path.dirname(process.execPath);
50
+ if (absolutePath.startsWith(exeDir)) {
51
+ return '.' + absolutePath.slice(exeDir.length).replace(/\\/g, '/');
52
+ }
53
+ const cwdDir = process.cwd();
54
+ if (absolutePath.startsWith(cwdDir)) {
55
+ return '.' + absolutePath.slice(cwdDir.length).replace(/\\/g, '/');
56
+ }
57
+ }
58
+ return absolutePath;
59
+ }
60
+
61
+ logger.info(`静态文件目录: ${getRelativePath(publicDir)}`);
62
+
63
  const app = express();
64
 
65
  // ==================== 通用重试工具(处理 429) ====================
 
206
  app.use(express.json({ limit: config.security.maxRequestSize }));
207
 
208
  // 静态文件服务
209
+ app.use('/images', express.static(path.join(publicDir, 'images')));
210
+ app.use(express.static(publicDir));
211
 
212
  // 管理路由
213
  app.use('/admin', adminRouter);
src/utils/imageStorage.js CHANGED
@@ -7,10 +7,47 @@ import { getDefaultIp } from './utils.js';
7
  const __filename = fileURLToPath(import.meta.url);
8
  const __dirname = path.dirname(__filename);
9
 
10
- const IMAGE_DIR = path.join(__dirname, '../../public/images');
 
11
 
12
- // 确保图片目录存在
13
- if (!fs.existsSync(IMAGE_DIR)) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  fs.mkdirSync(IMAGE_DIR, { recursive: true });
15
  }
16
 
 
7
  const __filename = fileURLToPath(import.meta.url);
8
  const __dirname = path.dirname(__filename);
9
 
10
+ // 检测是否在 pkg 打包环境中运行
11
+ const isPkg = typeof process.pkg !== 'undefined';
12
 
13
+ // 获取图片存储目录
14
+ // pkg 环境下使用可执行文件所在目录或当前工作目录
15
+ function getImageDir() {
16
+ if (isPkg) {
17
+ // pkg 环境:优先使用可执行文件旁边的 public/images 目录
18
+ const exeDir = path.dirname(process.execPath);
19
+ const exeImageDir = path.join(exeDir, 'public', 'images');
20
+ try {
21
+ if (!fs.existsSync(exeImageDir)) {
22
+ fs.mkdirSync(exeImageDir, { recursive: true });
23
+ }
24
+ return exeImageDir;
25
+ } catch (e) {
26
+ // 如果无法创建,尝试当前工作目录
27
+ const cwdImageDir = path.join(process.cwd(), 'public', 'images');
28
+ try {
29
+ if (!fs.existsSync(cwdImageDir)) {
30
+ fs.mkdirSync(cwdImageDir, { recursive: true });
31
+ }
32
+ return cwdImageDir;
33
+ } catch (e2) {
34
+ // 最后使用用户主目录
35
+ const homeImageDir = path.join(process.env.HOME || process.env.USERPROFILE || '.', '.antigravity', 'images');
36
+ if (!fs.existsSync(homeImageDir)) {
37
+ fs.mkdirSync(homeImageDir, { recursive: true });
38
+ }
39
+ return homeImageDir;
40
+ }
41
+ }
42
+ }
43
+ // 开发环境
44
+ return path.join(__dirname, '../../public/images');
45
+ }
46
+
47
+ const IMAGE_DIR = getImageDir();
48
+
49
+ // 确保图片目录存在(开发环境)
50
+ if (!isPkg && !fs.existsSync(IMAGE_DIR)) {
51
  fs.mkdirSync(IMAGE_DIR, { recursive: true });
52
  }
53