NOT-OMEGA commited on
Commit
ce2f5d4
·
verified ·
1 Parent(s): 2b81bff

Delete frontend

Browse files
frontend/index.html DELETED
@@ -1,16 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <meta name="description" content="AutoForge – Autonomous DAG-based code generation and verification platform powered by LLMs." />
7
- <title>AutoForge – AI Code Generation</title>
8
- <link rel="preconnect" href="https://fonts.googleapis.com" />
9
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
11
- </head>
12
- <body>
13
- <div id="root"></div>
14
- <script type="module" src="/src/main.tsx"></script>
15
- </body>
16
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/package-lock.json DELETED
@@ -1,1792 +0,0 @@
1
- {
2
- "name": "autoforge-frontend",
3
- "version": "0.1.0",
4
- "lockfileVersion": 3,
5
- "requires": true,
6
- "packages": {
7
- "": {
8
- "name": "autoforge-frontend",
9
- "version": "0.1.0",
10
- "dependencies": {
11
- "react": "^18.3.1",
12
- "react-dom": "^18.3.1",
13
- "react-router-dom": "^6.28.0"
14
- },
15
- "devDependencies": {
16
- "@types/react": "^18.3.12",
17
- "@types/react-dom": "^18.3.1",
18
- "@vitejs/plugin-react": "^4.3.3",
19
- "typescript": "^5.6.3",
20
- "vite": "^5.4.11"
21
- }
22
- },
23
- "node_modules/@babel/code-frame": {
24
- "version": "7.29.7",
25
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
26
- "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
27
- "dev": true,
28
- "license": "MIT",
29
- "dependencies": {
30
- "@babel/helper-validator-identifier": "^7.29.7",
31
- "js-tokens": "^4.0.0",
32
- "picocolors": "^1.1.1"
33
- },
34
- "engines": {
35
- "node": ">=6.9.0"
36
- }
37
- },
38
- "node_modules/@babel/compat-data": {
39
- "version": "7.29.7",
40
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
41
- "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
42
- "dev": true,
43
- "license": "MIT",
44
- "engines": {
45
- "node": ">=6.9.0"
46
- }
47
- },
48
- "node_modules/@babel/core": {
49
- "version": "7.29.7",
50
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
51
- "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
52
- "dev": true,
53
- "license": "MIT",
54
- "dependencies": {
55
- "@babel/code-frame": "^7.29.7",
56
- "@babel/generator": "^7.29.7",
57
- "@babel/helper-compilation-targets": "^7.29.7",
58
- "@babel/helper-module-transforms": "^7.29.7",
59
- "@babel/helpers": "^7.29.7",
60
- "@babel/parser": "^7.29.7",
61
- "@babel/template": "^7.29.7",
62
- "@babel/traverse": "^7.29.7",
63
- "@babel/types": "^7.29.7",
64
- "@jridgewell/remapping": "^2.3.5",
65
- "convert-source-map": "^2.0.0",
66
- "debug": "^4.1.0",
67
- "gensync": "^1.0.0-beta.2",
68
- "json5": "^2.2.3",
69
- "semver": "^6.3.1"
70
- },
71
- "engines": {
72
- "node": ">=6.9.0"
73
- },
74
- "funding": {
75
- "type": "opencollective",
76
- "url": "https://opencollective.com/babel"
77
- }
78
- },
79
- "node_modules/@babel/generator": {
80
- "version": "7.29.8",
81
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz",
82
- "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
83
- "dev": true,
84
- "license": "MIT",
85
- "dependencies": {
86
- "@babel/parser": "^7.29.8",
87
- "@babel/types": "^7.29.8",
88
- "@jridgewell/gen-mapping": "^0.3.12",
89
- "@jridgewell/trace-mapping": "^0.3.28",
90
- "jsesc": "^3.0.2"
91
- },
92
- "engines": {
93
- "node": ">=6.9.0"
94
- }
95
- },
96
- "node_modules/@babel/helper-compilation-targets": {
97
- "version": "7.29.7",
98
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
99
- "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
100
- "dev": true,
101
- "license": "MIT",
102
- "dependencies": {
103
- "@babel/compat-data": "^7.29.7",
104
- "@babel/helper-validator-option": "^7.29.7",
105
- "browserslist": "^4.24.0",
106
- "lru-cache": "^5.1.1",
107
- "semver": "^6.3.1"
108
- },
109
- "engines": {
110
- "node": ">=6.9.0"
111
- }
112
- },
113
- "node_modules/@babel/helper-globals": {
114
- "version": "7.29.7",
115
- "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
116
- "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
117
- "dev": true,
118
- "license": "MIT",
119
- "engines": {
120
- "node": ">=6.9.0"
121
- }
122
- },
123
- "node_modules/@babel/helper-module-imports": {
124
- "version": "7.29.7",
125
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
126
- "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
127
- "dev": true,
128
- "license": "MIT",
129
- "dependencies": {
130
- "@babel/traverse": "^7.29.7",
131
- "@babel/types": "^7.29.7"
132
- },
133
- "engines": {
134
- "node": ">=6.9.0"
135
- }
136
- },
137
- "node_modules/@babel/helper-module-transforms": {
138
- "version": "7.29.7",
139
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
140
- "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
141
- "dev": true,
142
- "license": "MIT",
143
- "dependencies": {
144
- "@babel/helper-module-imports": "^7.29.7",
145
- "@babel/helper-validator-identifier": "^7.29.7",
146
- "@babel/traverse": "^7.29.7"
147
- },
148
- "engines": {
149
- "node": ">=6.9.0"
150
- },
151
- "peerDependencies": {
152
- "@babel/core": "^7.0.0"
153
- }
154
- },
155
- "node_modules/@babel/helper-plugin-utils": {
156
- "version": "7.29.7",
157
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
158
- "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
159
- "dev": true,
160
- "license": "MIT",
161
- "engines": {
162
- "node": ">=6.9.0"
163
- }
164
- },
165
- "node_modules/@babel/helper-string-parser": {
166
- "version": "7.29.7",
167
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
168
- "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
169
- "dev": true,
170
- "license": "MIT",
171
- "engines": {
172
- "node": ">=6.9.0"
173
- }
174
- },
175
- "node_modules/@babel/helper-validator-identifier": {
176
- "version": "7.29.7",
177
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
178
- "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
179
- "dev": true,
180
- "license": "MIT",
181
- "engines": {
182
- "node": ">=6.9.0"
183
- }
184
- },
185
- "node_modules/@babel/helper-validator-option": {
186
- "version": "7.29.7",
187
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
188
- "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
189
- "dev": true,
190
- "license": "MIT",
191
- "engines": {
192
- "node": ">=6.9.0"
193
- }
194
- },
195
- "node_modules/@babel/helpers": {
196
- "version": "7.29.7",
197
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
198
- "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
199
- "dev": true,
200
- "license": "MIT",
201
- "dependencies": {
202
- "@babel/template": "^7.29.7",
203
- "@babel/types": "^7.29.7"
204
- },
205
- "engines": {
206
- "node": ">=6.9.0"
207
- }
208
- },
209
- "node_modules/@babel/parser": {
210
- "version": "7.29.8",
211
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
212
- "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
213
- "dev": true,
214
- "license": "MIT",
215
- "dependencies": {
216
- "@babel/types": "^7.29.8"
217
- },
218
- "bin": {
219
- "parser": "bin/babel-parser.js"
220
- },
221
- "engines": {
222
- "node": ">=6.0.0"
223
- }
224
- },
225
- "node_modules/@babel/plugin-transform-react-jsx-self": {
226
- "version": "7.29.7",
227
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz",
228
- "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==",
229
- "dev": true,
230
- "license": "MIT",
231
- "dependencies": {
232
- "@babel/helper-plugin-utils": "^7.29.7"
233
- },
234
- "engines": {
235
- "node": ">=6.9.0"
236
- },
237
- "peerDependencies": {
238
- "@babel/core": "^7.0.0-0"
239
- }
240
- },
241
- "node_modules/@babel/plugin-transform-react-jsx-source": {
242
- "version": "7.29.7",
243
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz",
244
- "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==",
245
- "dev": true,
246
- "license": "MIT",
247
- "dependencies": {
248
- "@babel/helper-plugin-utils": "^7.29.7"
249
- },
250
- "engines": {
251
- "node": ">=6.9.0"
252
- },
253
- "peerDependencies": {
254
- "@babel/core": "^7.0.0-0"
255
- }
256
- },
257
- "node_modules/@babel/template": {
258
- "version": "7.29.7",
259
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
260
- "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
261
- "dev": true,
262
- "license": "MIT",
263
- "dependencies": {
264
- "@babel/code-frame": "^7.29.7",
265
- "@babel/parser": "^7.29.7",
266
- "@babel/types": "^7.29.7"
267
- },
268
- "engines": {
269
- "node": ">=6.9.0"
270
- }
271
- },
272
- "node_modules/@babel/traverse": {
273
- "version": "7.29.8",
274
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz",
275
- "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==",
276
- "dev": true,
277
- "license": "MIT",
278
- "dependencies": {
279
- "@babel/code-frame": "^7.29.7",
280
- "@babel/generator": "^7.29.8",
281
- "@babel/helper-globals": "^7.29.7",
282
- "@babel/parser": "^7.29.8",
283
- "@babel/template": "^7.29.7",
284
- "@babel/types": "^7.29.8",
285
- "debug": "^4.3.1"
286
- },
287
- "engines": {
288
- "node": ">=6.9.0"
289
- }
290
- },
291
- "node_modules/@babel/types": {
292
- "version": "7.29.8",
293
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
294
- "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
295
- "dev": true,
296
- "license": "MIT",
297
- "dependencies": {
298
- "@babel/helper-string-parser": "^7.29.7",
299
- "@babel/helper-validator-identifier": "^7.29.7"
300
- },
301
- "engines": {
302
- "node": ">=6.9.0"
303
- }
304
- },
305
- "node_modules/@esbuild/aix-ppc64": {
306
- "version": "0.21.5",
307
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
308
- "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
309
- "cpu": [
310
- "ppc64"
311
- ],
312
- "dev": true,
313
- "license": "MIT",
314
- "optional": true,
315
- "os": [
316
- "aix"
317
- ],
318
- "engines": {
319
- "node": ">=12"
320
- }
321
- },
322
- "node_modules/@esbuild/android-arm": {
323
- "version": "0.21.5",
324
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
325
- "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
326
- "cpu": [
327
- "arm"
328
- ],
329
- "dev": true,
330
- "license": "MIT",
331
- "optional": true,
332
- "os": [
333
- "android"
334
- ],
335
- "engines": {
336
- "node": ">=12"
337
- }
338
- },
339
- "node_modules/@esbuild/android-arm64": {
340
- "version": "0.21.5",
341
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
342
- "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
343
- "cpu": [
344
- "arm64"
345
- ],
346
- "dev": true,
347
- "license": "MIT",
348
- "optional": true,
349
- "os": [
350
- "android"
351
- ],
352
- "engines": {
353
- "node": ">=12"
354
- }
355
- },
356
- "node_modules/@esbuild/android-x64": {
357
- "version": "0.21.5",
358
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
359
- "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
360
- "cpu": [
361
- "x64"
362
- ],
363
- "dev": true,
364
- "license": "MIT",
365
- "optional": true,
366
- "os": [
367
- "android"
368
- ],
369
- "engines": {
370
- "node": ">=12"
371
- }
372
- },
373
- "node_modules/@esbuild/darwin-arm64": {
374
- "version": "0.21.5",
375
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
376
- "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
377
- "cpu": [
378
- "arm64"
379
- ],
380
- "dev": true,
381
- "license": "MIT",
382
- "optional": true,
383
- "os": [
384
- "darwin"
385
- ],
386
- "engines": {
387
- "node": ">=12"
388
- }
389
- },
390
- "node_modules/@esbuild/darwin-x64": {
391
- "version": "0.21.5",
392
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
393
- "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
394
- "cpu": [
395
- "x64"
396
- ],
397
- "dev": true,
398
- "license": "MIT",
399
- "optional": true,
400
- "os": [
401
- "darwin"
402
- ],
403
- "engines": {
404
- "node": ">=12"
405
- }
406
- },
407
- "node_modules/@esbuild/freebsd-arm64": {
408
- "version": "0.21.5",
409
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
410
- "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
411
- "cpu": [
412
- "arm64"
413
- ],
414
- "dev": true,
415
- "license": "MIT",
416
- "optional": true,
417
- "os": [
418
- "freebsd"
419
- ],
420
- "engines": {
421
- "node": ">=12"
422
- }
423
- },
424
- "node_modules/@esbuild/freebsd-x64": {
425
- "version": "0.21.5",
426
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
427
- "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
428
- "cpu": [
429
- "x64"
430
- ],
431
- "dev": true,
432
- "license": "MIT",
433
- "optional": true,
434
- "os": [
435
- "freebsd"
436
- ],
437
- "engines": {
438
- "node": ">=12"
439
- }
440
- },
441
- "node_modules/@esbuild/linux-arm": {
442
- "version": "0.21.5",
443
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
444
- "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
445
- "cpu": [
446
- "arm"
447
- ],
448
- "dev": true,
449
- "license": "MIT",
450
- "optional": true,
451
- "os": [
452
- "linux"
453
- ],
454
- "engines": {
455
- "node": ">=12"
456
- }
457
- },
458
- "node_modules/@esbuild/linux-arm64": {
459
- "version": "0.21.5",
460
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
461
- "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
462
- "cpu": [
463
- "arm64"
464
- ],
465
- "dev": true,
466
- "license": "MIT",
467
- "optional": true,
468
- "os": [
469
- "linux"
470
- ],
471
- "engines": {
472
- "node": ">=12"
473
- }
474
- },
475
- "node_modules/@esbuild/linux-ia32": {
476
- "version": "0.21.5",
477
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
478
- "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
479
- "cpu": [
480
- "ia32"
481
- ],
482
- "dev": true,
483
- "license": "MIT",
484
- "optional": true,
485
- "os": [
486
- "linux"
487
- ],
488
- "engines": {
489
- "node": ">=12"
490
- }
491
- },
492
- "node_modules/@esbuild/linux-loong64": {
493
- "version": "0.21.5",
494
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
495
- "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
496
- "cpu": [
497
- "loong64"
498
- ],
499
- "dev": true,
500
- "license": "MIT",
501
- "optional": true,
502
- "os": [
503
- "linux"
504
- ],
505
- "engines": {
506
- "node": ">=12"
507
- }
508
- },
509
- "node_modules/@esbuild/linux-mips64el": {
510
- "version": "0.21.5",
511
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
512
- "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
513
- "cpu": [
514
- "mips64el"
515
- ],
516
- "dev": true,
517
- "license": "MIT",
518
- "optional": true,
519
- "os": [
520
- "linux"
521
- ],
522
- "engines": {
523
- "node": ">=12"
524
- }
525
- },
526
- "node_modules/@esbuild/linux-ppc64": {
527
- "version": "0.21.5",
528
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
529
- "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
530
- "cpu": [
531
- "ppc64"
532
- ],
533
- "dev": true,
534
- "license": "MIT",
535
- "optional": true,
536
- "os": [
537
- "linux"
538
- ],
539
- "engines": {
540
- "node": ">=12"
541
- }
542
- },
543
- "node_modules/@esbuild/linux-riscv64": {
544
- "version": "0.21.5",
545
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
546
- "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
547
- "cpu": [
548
- "riscv64"
549
- ],
550
- "dev": true,
551
- "license": "MIT",
552
- "optional": true,
553
- "os": [
554
- "linux"
555
- ],
556
- "engines": {
557
- "node": ">=12"
558
- }
559
- },
560
- "node_modules/@esbuild/linux-s390x": {
561
- "version": "0.21.5",
562
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
563
- "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
564
- "cpu": [
565
- "s390x"
566
- ],
567
- "dev": true,
568
- "license": "MIT",
569
- "optional": true,
570
- "os": [
571
- "linux"
572
- ],
573
- "engines": {
574
- "node": ">=12"
575
- }
576
- },
577
- "node_modules/@esbuild/linux-x64": {
578
- "version": "0.21.5",
579
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
580
- "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
581
- "cpu": [
582
- "x64"
583
- ],
584
- "dev": true,
585
- "license": "MIT",
586
- "optional": true,
587
- "os": [
588
- "linux"
589
- ],
590
- "engines": {
591
- "node": ">=12"
592
- }
593
- },
594
- "node_modules/@esbuild/netbsd-x64": {
595
- "version": "0.21.5",
596
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
597
- "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
598
- "cpu": [
599
- "x64"
600
- ],
601
- "dev": true,
602
- "license": "MIT",
603
- "optional": true,
604
- "os": [
605
- "netbsd"
606
- ],
607
- "engines": {
608
- "node": ">=12"
609
- }
610
- },
611
- "node_modules/@esbuild/openbsd-x64": {
612
- "version": "0.21.5",
613
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
614
- "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
615
- "cpu": [
616
- "x64"
617
- ],
618
- "dev": true,
619
- "license": "MIT",
620
- "optional": true,
621
- "os": [
622
- "openbsd"
623
- ],
624
- "engines": {
625
- "node": ">=12"
626
- }
627
- },
628
- "node_modules/@esbuild/sunos-x64": {
629
- "version": "0.21.5",
630
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
631
- "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
632
- "cpu": [
633
- "x64"
634
- ],
635
- "dev": true,
636
- "license": "MIT",
637
- "optional": true,
638
- "os": [
639
- "sunos"
640
- ],
641
- "engines": {
642
- "node": ">=12"
643
- }
644
- },
645
- "node_modules/@esbuild/win32-arm64": {
646
- "version": "0.21.5",
647
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
648
- "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
649
- "cpu": [
650
- "arm64"
651
- ],
652
- "dev": true,
653
- "license": "MIT",
654
- "optional": true,
655
- "os": [
656
- "win32"
657
- ],
658
- "engines": {
659
- "node": ">=12"
660
- }
661
- },
662
- "node_modules/@esbuild/win32-ia32": {
663
- "version": "0.21.5",
664
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
665
- "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
666
- "cpu": [
667
- "ia32"
668
- ],
669
- "dev": true,
670
- "license": "MIT",
671
- "optional": true,
672
- "os": [
673
- "win32"
674
- ],
675
- "engines": {
676
- "node": ">=12"
677
- }
678
- },
679
- "node_modules/@esbuild/win32-x64": {
680
- "version": "0.21.5",
681
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
682
- "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
683
- "cpu": [
684
- "x64"
685
- ],
686
- "dev": true,
687
- "license": "MIT",
688
- "optional": true,
689
- "os": [
690
- "win32"
691
- ],
692
- "engines": {
693
- "node": ">=12"
694
- }
695
- },
696
- "node_modules/@jridgewell/gen-mapping": {
697
- "version": "0.3.13",
698
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
699
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
700
- "dev": true,
701
- "license": "MIT",
702
- "dependencies": {
703
- "@jridgewell/sourcemap-codec": "^1.5.0",
704
- "@jridgewell/trace-mapping": "^0.3.24"
705
- }
706
- },
707
- "node_modules/@jridgewell/remapping": {
708
- "version": "2.3.5",
709
- "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
710
- "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
711
- "dev": true,
712
- "license": "MIT",
713
- "dependencies": {
714
- "@jridgewell/gen-mapping": "^0.3.5",
715
- "@jridgewell/trace-mapping": "^0.3.24"
716
- }
717
- },
718
- "node_modules/@jridgewell/resolve-uri": {
719
- "version": "3.1.2",
720
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
721
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
722
- "dev": true,
723
- "license": "MIT",
724
- "engines": {
725
- "node": ">=6.0.0"
726
- }
727
- },
728
- "node_modules/@jridgewell/sourcemap-codec": {
729
- "version": "1.6.0",
730
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
731
- "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
732
- "dev": true,
733
- "license": "MIT"
734
- },
735
- "node_modules/@jridgewell/trace-mapping": {
736
- "version": "0.3.31",
737
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
738
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
739
- "dev": true,
740
- "license": "MIT",
741
- "dependencies": {
742
- "@jridgewell/resolve-uri": "^3.1.0",
743
- "@jridgewell/sourcemap-codec": "^1.4.14"
744
- }
745
- },
746
- "node_modules/@napi-rs/lzma-linux-x64-gnu": {
747
- "version": "1.5.1",
748
- "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
749
- "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
750
- "cpu": [
751
- "x64"
752
- ],
753
- "dev": true,
754
- "license": "MIT",
755
- "optional": true,
756
- "os": [
757
- "linux"
758
- ],
759
- "engines": {
760
- "node": "^22.20 || ^24.12 || >=25"
761
- }
762
- },
763
- "node_modules/@remix-run/router": {
764
- "version": "1.23.4",
765
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.4.tgz",
766
- "integrity": "sha512-q7j5geK7xs3UJSdm9/iytUNclBnLmYx1EnSeCFXHPeutdqgIMeFeHtUZgS3EhlKxdBEAu8OwtJCwmLrEzpSs7Q==",
767
- "license": "MIT",
768
- "engines": {
769
- "node": ">=14.0.0"
770
- }
771
- },
772
- "node_modules/@rolldown/pluginutils": {
773
- "version": "1.0.0-beta.27",
774
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
775
- "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
776
- "dev": true,
777
- "license": "MIT"
778
- },
779
- "node_modules/@rollup/rollup-android-arm-eabi": {
780
- "version": "4.63.1",
781
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz",
782
- "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==",
783
- "cpu": [
784
- "arm"
785
- ],
786
- "dev": true,
787
- "license": "MIT",
788
- "optional": true,
789
- "os": [
790
- "android"
791
- ]
792
- },
793
- "node_modules/@rollup/rollup-android-arm64": {
794
- "version": "4.63.1",
795
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz",
796
- "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==",
797
- "cpu": [
798
- "arm64"
799
- ],
800
- "dev": true,
801
- "license": "MIT",
802
- "optional": true,
803
- "os": [
804
- "android"
805
- ]
806
- },
807
- "node_modules/@rollup/rollup-darwin-arm64": {
808
- "version": "4.63.1",
809
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz",
810
- "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==",
811
- "cpu": [
812
- "arm64"
813
- ],
814
- "dev": true,
815
- "license": "MIT",
816
- "optional": true,
817
- "os": [
818
- "darwin"
819
- ]
820
- },
821
- "node_modules/@rollup/rollup-darwin-x64": {
822
- "version": "4.63.1",
823
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz",
824
- "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==",
825
- "cpu": [
826
- "x64"
827
- ],
828
- "dev": true,
829
- "license": "MIT",
830
- "optional": true,
831
- "os": [
832
- "darwin"
833
- ]
834
- },
835
- "node_modules/@rollup/rollup-freebsd-arm64": {
836
- "version": "4.63.1",
837
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz",
838
- "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==",
839
- "cpu": [
840
- "arm64"
841
- ],
842
- "dev": true,
843
- "license": "MIT",
844
- "optional": true,
845
- "os": [
846
- "freebsd"
847
- ]
848
- },
849
- "node_modules/@rollup/rollup-freebsd-x64": {
850
- "version": "4.63.1",
851
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz",
852
- "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==",
853
- "cpu": [
854
- "x64"
855
- ],
856
- "dev": true,
857
- "license": "MIT",
858
- "optional": true,
859
- "os": [
860
- "freebsd"
861
- ]
862
- },
863
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
864
- "version": "4.63.1",
865
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz",
866
- "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==",
867
- "cpu": [
868
- "arm"
869
- ],
870
- "dev": true,
871
- "license": "MIT",
872
- "optional": true,
873
- "os": [
874
- "linux"
875
- ]
876
- },
877
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
878
- "version": "4.63.1",
879
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz",
880
- "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==",
881
- "cpu": [
882
- "arm"
883
- ],
884
- "dev": true,
885
- "license": "MIT",
886
- "optional": true,
887
- "os": [
888
- "linux"
889
- ]
890
- },
891
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
892
- "version": "4.63.1",
893
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz",
894
- "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==",
895
- "cpu": [
896
- "arm64"
897
- ],
898
- "dev": true,
899
- "license": "MIT",
900
- "optional": true,
901
- "os": [
902
- "linux"
903
- ]
904
- },
905
- "node_modules/@rollup/rollup-linux-arm64-musl": {
906
- "version": "4.63.1",
907
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz",
908
- "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==",
909
- "cpu": [
910
- "arm64"
911
- ],
912
- "dev": true,
913
- "license": "MIT",
914
- "optional": true,
915
- "os": [
916
- "linux"
917
- ]
918
- },
919
- "node_modules/@rollup/rollup-linux-loong64-gnu": {
920
- "version": "4.63.1",
921
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz",
922
- "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==",
923
- "cpu": [
924
- "loong64"
925
- ],
926
- "dev": true,
927
- "license": "MIT",
928
- "optional": true,
929
- "os": [
930
- "linux"
931
- ]
932
- },
933
- "node_modules/@rollup/rollup-linux-loong64-musl": {
934
- "version": "4.63.1",
935
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz",
936
- "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==",
937
- "cpu": [
938
- "loong64"
939
- ],
940
- "dev": true,
941
- "license": "MIT",
942
- "optional": true,
943
- "os": [
944
- "linux"
945
- ]
946
- },
947
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
948
- "version": "4.63.1",
949
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz",
950
- "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==",
951
- "cpu": [
952
- "ppc64"
953
- ],
954
- "dev": true,
955
- "license": "MIT",
956
- "optional": true,
957
- "os": [
958
- "linux"
959
- ]
960
- },
961
- "node_modules/@rollup/rollup-linux-ppc64-musl": {
962
- "version": "4.63.1",
963
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz",
964
- "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==",
965
- "cpu": [
966
- "ppc64"
967
- ],
968
- "dev": true,
969
- "license": "MIT",
970
- "optional": true,
971
- "os": [
972
- "linux"
973
- ]
974
- },
975
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
976
- "version": "4.63.1",
977
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz",
978
- "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==",
979
- "cpu": [
980
- "riscv64"
981
- ],
982
- "dev": true,
983
- "license": "MIT",
984
- "optional": true,
985
- "os": [
986
- "linux"
987
- ]
988
- },
989
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
990
- "version": "4.63.1",
991
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz",
992
- "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==",
993
- "cpu": [
994
- "riscv64"
995
- ],
996
- "dev": true,
997
- "license": "MIT",
998
- "optional": true,
999
- "os": [
1000
- "linux"
1001
- ]
1002
- },
1003
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
1004
- "version": "4.63.1",
1005
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz",
1006
- "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==",
1007
- "cpu": [
1008
- "s390x"
1009
- ],
1010
- "dev": true,
1011
- "license": "MIT",
1012
- "optional": true,
1013
- "os": [
1014
- "linux"
1015
- ]
1016
- },
1017
- "node_modules/@rollup/rollup-linux-x64-gnu": {
1018
- "version": "4.63.1",
1019
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz",
1020
- "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==",
1021
- "cpu": [
1022
- "x64"
1023
- ],
1024
- "dev": true,
1025
- "license": "MIT",
1026
- "optional": true,
1027
- "os": [
1028
- "linux"
1029
- ]
1030
- },
1031
- "node_modules/@rollup/rollup-linux-x64-musl": {
1032
- "version": "4.63.1",
1033
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz",
1034
- "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==",
1035
- "cpu": [
1036
- "x64"
1037
- ],
1038
- "dev": true,
1039
- "license": "MIT",
1040
- "optional": true,
1041
- "os": [
1042
- "linux"
1043
- ]
1044
- },
1045
- "node_modules/@rollup/rollup-openbsd-x64": {
1046
- "version": "4.63.1",
1047
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz",
1048
- "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==",
1049
- "cpu": [
1050
- "x64"
1051
- ],
1052
- "dev": true,
1053
- "license": "MIT",
1054
- "optional": true,
1055
- "os": [
1056
- "openbsd"
1057
- ]
1058
- },
1059
- "node_modules/@rollup/rollup-openharmony-arm64": {
1060
- "version": "4.63.1",
1061
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz",
1062
- "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==",
1063
- "cpu": [
1064
- "arm64"
1065
- ],
1066
- "dev": true,
1067
- "license": "MIT",
1068
- "optional": true,
1069
- "os": [
1070
- "openharmony"
1071
- ]
1072
- },
1073
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
1074
- "version": "4.63.1",
1075
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz",
1076
- "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==",
1077
- "cpu": [
1078
- "arm64"
1079
- ],
1080
- "dev": true,
1081
- "license": "MIT",
1082
- "optional": true,
1083
- "os": [
1084
- "win32"
1085
- ]
1086
- },
1087
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
1088
- "version": "4.63.1",
1089
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz",
1090
- "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==",
1091
- "cpu": [
1092
- "ia32"
1093
- ],
1094
- "dev": true,
1095
- "license": "MIT",
1096
- "optional": true,
1097
- "os": [
1098
- "win32"
1099
- ]
1100
- },
1101
- "node_modules/@rollup/rollup-win32-x64-gnu": {
1102
- "version": "4.63.1",
1103
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz",
1104
- "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==",
1105
- "cpu": [
1106
- "x64"
1107
- ],
1108
- "dev": true,
1109
- "license": "MIT",
1110
- "optional": true,
1111
- "os": [
1112
- "win32"
1113
- ]
1114
- },
1115
- "node_modules/@rollup/rollup-win32-x64-msvc": {
1116
- "version": "4.63.1",
1117
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz",
1118
- "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==",
1119
- "cpu": [
1120
- "x64"
1121
- ],
1122
- "dev": true,
1123
- "license": "MIT",
1124
- "optional": true,
1125
- "os": [
1126
- "win32"
1127
- ]
1128
- },
1129
- "node_modules/@types/babel__core": {
1130
- "version": "7.20.5",
1131
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1132
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1133
- "dev": true,
1134
- "license": "MIT",
1135
- "dependencies": {
1136
- "@babel/parser": "^7.20.7",
1137
- "@babel/types": "^7.20.7",
1138
- "@types/babel__generator": "*",
1139
- "@types/babel__template": "*",
1140
- "@types/babel__traverse": "*"
1141
- }
1142
- },
1143
- "node_modules/@types/babel__generator": {
1144
- "version": "7.27.0",
1145
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
1146
- "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
1147
- "dev": true,
1148
- "license": "MIT",
1149
- "dependencies": {
1150
- "@babel/types": "^7.0.0"
1151
- }
1152
- },
1153
- "node_modules/@types/babel__template": {
1154
- "version": "7.4.4",
1155
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1156
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1157
- "dev": true,
1158
- "license": "MIT",
1159
- "dependencies": {
1160
- "@babel/parser": "^7.1.0",
1161
- "@babel/types": "^7.0.0"
1162
- }
1163
- },
1164
- "node_modules/@types/babel__traverse": {
1165
- "version": "7.28.0",
1166
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
1167
- "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
1168
- "dev": true,
1169
- "license": "MIT",
1170
- "dependencies": {
1171
- "@babel/types": "^7.28.2"
1172
- }
1173
- },
1174
- "node_modules/@types/estree": {
1175
- "version": "1.0.9",
1176
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
1177
- "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
1178
- "dev": true,
1179
- "license": "MIT"
1180
- },
1181
- "node_modules/@types/prop-types": {
1182
- "version": "15.7.15",
1183
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
1184
- "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
1185
- "dev": true,
1186
- "license": "MIT"
1187
- },
1188
- "node_modules/@types/react": {
1189
- "version": "18.3.31",
1190
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz",
1191
- "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==",
1192
- "dev": true,
1193
- "license": "MIT",
1194
- "dependencies": {
1195
- "@types/prop-types": "*",
1196
- "csstype": "^3.2.2"
1197
- }
1198
- },
1199
- "node_modules/@types/react-dom": {
1200
- "version": "18.3.7",
1201
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
1202
- "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
1203
- "dev": true,
1204
- "license": "MIT",
1205
- "peerDependencies": {
1206
- "@types/react": "^18.0.0"
1207
- }
1208
- },
1209
- "node_modules/@vitejs/plugin-react": {
1210
- "version": "4.7.0",
1211
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
1212
- "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
1213
- "dev": true,
1214
- "license": "MIT",
1215
- "dependencies": {
1216
- "@babel/core": "^7.28.0",
1217
- "@babel/plugin-transform-react-jsx-self": "^7.27.1",
1218
- "@babel/plugin-transform-react-jsx-source": "^7.27.1",
1219
- "@rolldown/pluginutils": "1.0.0-beta.27",
1220
- "@types/babel__core": "^7.20.5",
1221
- "react-refresh": "^0.17.0"
1222
- },
1223
- "engines": {
1224
- "node": "^14.18.0 || >=16.0.0"
1225
- },
1226
- "peerDependencies": {
1227
- "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
1228
- }
1229
- },
1230
- "node_modules/baseline-browser-mapping": {
1231
- "version": "2.11.20",
1232
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz",
1233
- "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==",
1234
- "dev": true,
1235
- "license": "Apache-2.0",
1236
- "bin": {
1237
- "baseline-browser-mapping": "dist/cli.cjs"
1238
- },
1239
- "engines": {
1240
- "node": ">=6.0.0"
1241
- }
1242
- },
1243
- "node_modules/browserslist": {
1244
- "version": "4.28.8",
1245
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz",
1246
- "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==",
1247
- "dev": true,
1248
- "funding": [
1249
- {
1250
- "type": "opencollective",
1251
- "url": "https://opencollective.com/browserslist"
1252
- },
1253
- {
1254
- "type": "tidelift",
1255
- "url": "https://tidelift.com/funding/github/npm/browserslist"
1256
- },
1257
- {
1258
- "type": "github",
1259
- "url": "https://github.com/sponsors/ai"
1260
- }
1261
- ],
1262
- "license": "MIT",
1263
- "dependencies": {
1264
- "baseline-browser-mapping": "^2.11.12",
1265
- "caniuse-lite": "^1.0.30001809",
1266
- "electron-to-chromium": "^1.5.402",
1267
- "node-releases": "^2.0.53",
1268
- "update-browserslist-db": "^1.3.0"
1269
- },
1270
- "bin": {
1271
- "browserslist": "cli.js"
1272
- },
1273
- "engines": {
1274
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1275
- }
1276
- },
1277
- "node_modules/caniuse-lite": {
1278
- "version": "1.0.30001810",
1279
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz",
1280
- "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==",
1281
- "dev": true,
1282
- "funding": [
1283
- {
1284
- "type": "opencollective",
1285
- "url": "https://opencollective.com/browserslist"
1286
- },
1287
- {
1288
- "type": "tidelift",
1289
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1290
- },
1291
- {
1292
- "type": "github",
1293
- "url": "https://github.com/sponsors/ai"
1294
- }
1295
- ],
1296
- "license": "CC-BY-4.0"
1297
- },
1298
- "node_modules/convert-source-map": {
1299
- "version": "2.0.0",
1300
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1301
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1302
- "dev": true,
1303
- "license": "MIT"
1304
- },
1305
- "node_modules/csstype": {
1306
- "version": "3.2.3",
1307
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
1308
- "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
1309
- "dev": true,
1310
- "license": "MIT"
1311
- },
1312
- "node_modules/debug": {
1313
- "version": "4.4.3",
1314
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1315
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1316
- "dev": true,
1317
- "license": "MIT",
1318
- "dependencies": {
1319
- "ms": "^2.1.3"
1320
- },
1321
- "engines": {
1322
- "node": ">=6.0"
1323
- },
1324
- "peerDependenciesMeta": {
1325
- "supports-color": {
1326
- "optional": true
1327
- }
1328
- }
1329
- },
1330
- "node_modules/electron-to-chromium": {
1331
- "version": "1.5.416",
1332
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.416.tgz",
1333
- "integrity": "sha512-K6bvB2BjnNrugtIih6ewlbBI9DXa976jIdiIlRLHhBoEI9a4JaQjjHyF+A1IQI543aQYR4LnmOrT/K5fZj0aPA==",
1334
- "dev": true,
1335
- "license": "ISC"
1336
- },
1337
- "node_modules/esbuild": {
1338
- "version": "0.21.5",
1339
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
1340
- "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
1341
- "dev": true,
1342
- "hasInstallScript": true,
1343
- "license": "MIT",
1344
- "bin": {
1345
- "esbuild": "bin/esbuild"
1346
- },
1347
- "engines": {
1348
- "node": ">=12"
1349
- },
1350
- "optionalDependencies": {
1351
- "@esbuild/aix-ppc64": "0.21.5",
1352
- "@esbuild/android-arm": "0.21.5",
1353
- "@esbuild/android-arm64": "0.21.5",
1354
- "@esbuild/android-x64": "0.21.5",
1355
- "@esbuild/darwin-arm64": "0.21.5",
1356
- "@esbuild/darwin-x64": "0.21.5",
1357
- "@esbuild/freebsd-arm64": "0.21.5",
1358
- "@esbuild/freebsd-x64": "0.21.5",
1359
- "@esbuild/linux-arm": "0.21.5",
1360
- "@esbuild/linux-arm64": "0.21.5",
1361
- "@esbuild/linux-ia32": "0.21.5",
1362
- "@esbuild/linux-loong64": "0.21.5",
1363
- "@esbuild/linux-mips64el": "0.21.5",
1364
- "@esbuild/linux-ppc64": "0.21.5",
1365
- "@esbuild/linux-riscv64": "0.21.5",
1366
- "@esbuild/linux-s390x": "0.21.5",
1367
- "@esbuild/linux-x64": "0.21.5",
1368
- "@esbuild/netbsd-x64": "0.21.5",
1369
- "@esbuild/openbsd-x64": "0.21.5",
1370
- "@esbuild/sunos-x64": "0.21.5",
1371
- "@esbuild/win32-arm64": "0.21.5",
1372
- "@esbuild/win32-ia32": "0.21.5",
1373
- "@esbuild/win32-x64": "0.21.5"
1374
- }
1375
- },
1376
- "node_modules/escalade": {
1377
- "version": "3.2.0",
1378
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1379
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1380
- "dev": true,
1381
- "license": "MIT",
1382
- "engines": {
1383
- "node": ">=6"
1384
- }
1385
- },
1386
- "node_modules/fsevents": {
1387
- "version": "2.3.3",
1388
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1389
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1390
- "dev": true,
1391
- "hasInstallScript": true,
1392
- "license": "MIT",
1393
- "optional": true,
1394
- "os": [
1395
- "darwin"
1396
- ],
1397
- "engines": {
1398
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1399
- }
1400
- },
1401
- "node_modules/gensync": {
1402
- "version": "1.0.0-beta.2",
1403
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1404
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1405
- "dev": true,
1406
- "license": "MIT",
1407
- "engines": {
1408
- "node": ">=6.9.0"
1409
- }
1410
- },
1411
- "node_modules/js-tokens": {
1412
- "version": "4.0.0",
1413
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1414
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1415
- "license": "MIT"
1416
- },
1417
- "node_modules/jsesc": {
1418
- "version": "3.1.0",
1419
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1420
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1421
- "dev": true,
1422
- "license": "MIT",
1423
- "bin": {
1424
- "jsesc": "bin/jsesc"
1425
- },
1426
- "engines": {
1427
- "node": ">=6"
1428
- }
1429
- },
1430
- "node_modules/json5": {
1431
- "version": "2.2.3",
1432
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1433
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1434
- "dev": true,
1435
- "license": "MIT",
1436
- "bin": {
1437
- "json5": "lib/cli.js"
1438
- },
1439
- "engines": {
1440
- "node": ">=6"
1441
- }
1442
- },
1443
- "node_modules/loose-envify": {
1444
- "version": "1.4.0",
1445
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1446
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1447
- "license": "MIT",
1448
- "dependencies": {
1449
- "js-tokens": "^3.0.0 || ^4.0.0"
1450
- },
1451
- "bin": {
1452
- "loose-envify": "cli.js"
1453
- }
1454
- },
1455
- "node_modules/lru-cache": {
1456
- "version": "5.1.1",
1457
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1458
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1459
- "dev": true,
1460
- "license": "ISC",
1461
- "dependencies": {
1462
- "yallist": "^3.0.2"
1463
- }
1464
- },
1465
- "node_modules/ms": {
1466
- "version": "2.1.3",
1467
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1468
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1469
- "dev": true,
1470
- "license": "MIT"
1471
- },
1472
- "node_modules/nanoid": {
1473
- "version": "3.3.18",
1474
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
1475
- "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
1476
- "dev": true,
1477
- "funding": [
1478
- {
1479
- "type": "github",
1480
- "url": "https://github.com/sponsors/ai"
1481
- }
1482
- ],
1483
- "license": "MIT",
1484
- "bin": {
1485
- "nanoid": "bin/nanoid.cjs"
1486
- },
1487
- "engines": {
1488
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1489
- }
1490
- },
1491
- "node_modules/node-releases": {
1492
- "version": "2.0.54",
1493
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz",
1494
- "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==",
1495
- "dev": true,
1496
- "license": "MIT",
1497
- "engines": {
1498
- "node": ">=18"
1499
- }
1500
- },
1501
- "node_modules/picocolors": {
1502
- "version": "1.1.1",
1503
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1504
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1505
- "dev": true,
1506
- "license": "ISC"
1507
- },
1508
- "node_modules/postcss": {
1509
- "version": "8.5.26",
1510
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
1511
- "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
1512
- "dev": true,
1513
- "funding": [
1514
- {
1515
- "type": "opencollective",
1516
- "url": "https://opencollective.com/postcss/"
1517
- },
1518
- {
1519
- "type": "tidelift",
1520
- "url": "https://tidelift.com/funding/github/npm/postcss"
1521
- },
1522
- {
1523
- "type": "github",
1524
- "url": "https://github.com/sponsors/ai"
1525
- }
1526
- ],
1527
- "license": "MIT",
1528
- "dependencies": {
1529
- "nanoid": "^3.3.17",
1530
- "picocolors": "^1.1.1",
1531
- "source-map-js": "^1.2.1"
1532
- },
1533
- "engines": {
1534
- "node": "^10 || ^12 || >=14"
1535
- }
1536
- },
1537
- "node_modules/react": {
1538
- "version": "18.3.1",
1539
- "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
1540
- "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
1541
- "license": "MIT",
1542
- "dependencies": {
1543
- "loose-envify": "^1.1.0"
1544
- },
1545
- "engines": {
1546
- "node": ">=0.10.0"
1547
- }
1548
- },
1549
- "node_modules/react-dom": {
1550
- "version": "18.3.1",
1551
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
1552
- "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
1553
- "license": "MIT",
1554
- "dependencies": {
1555
- "loose-envify": "^1.1.0",
1556
- "scheduler": "^0.23.2"
1557
- },
1558
- "peerDependencies": {
1559
- "react": "^18.3.1"
1560
- }
1561
- },
1562
- "node_modules/react-refresh": {
1563
- "version": "0.17.0",
1564
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
1565
- "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
1566
- "dev": true,
1567
- "license": "MIT",
1568
- "engines": {
1569
- "node": ">=0.10.0"
1570
- }
1571
- },
1572
- "node_modules/react-router": {
1573
- "version": "6.30.6",
1574
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.6.tgz",
1575
- "integrity": "sha512-5HfK7k5im7LTOB0EqCQmfvy4C13G92Ssj1VTmouTK3AJvyjKTnFuCV0vcMAD/JS+JC4DvDIBRrlAeJIFjh5VWg==",
1576
- "license": "MIT",
1577
- "dependencies": {
1578
- "@remix-run/router": "1.23.4"
1579
- },
1580
- "engines": {
1581
- "node": ">=14.0.0"
1582
- },
1583
- "peerDependencies": {
1584
- "react": ">=16.8"
1585
- }
1586
- },
1587
- "node_modules/react-router-dom": {
1588
- "version": "6.30.6",
1589
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.6.tgz",
1590
- "integrity": "sha512-0RHKZz7wwffvkU+2MFVT2NnjK44ssLEV+m0CAJaS2Ksmorrwj7WxH00jO0SOCW26/tINUnJHToXblDs33I38YQ==",
1591
- "license": "MIT",
1592
- "dependencies": {
1593
- "@remix-run/router": "1.23.4",
1594
- "react-router": "6.30.6"
1595
- },
1596
- "engines": {
1597
- "node": ">=14.0.0"
1598
- },
1599
- "peerDependencies": {
1600
- "react": ">=16.8",
1601
- "react-dom": ">=16.8"
1602
- }
1603
- },
1604
- "node_modules/rollup": {
1605
- "version": "4.63.1",
1606
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz",
1607
- "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==",
1608
- "dev": true,
1609
- "license": "MIT",
1610
- "dependencies": {
1611
- "@types/estree": "1.0.9"
1612
- },
1613
- "bin": {
1614
- "rollup": "dist/bin/rollup"
1615
- },
1616
- "engines": {
1617
- "node": ">=18.0.0",
1618
- "npm": ">=8.0.0"
1619
- },
1620
- "optionalDependencies": {
1621
- "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
1622
- "@rollup/rollup-android-arm-eabi": "4.63.1",
1623
- "@rollup/rollup-android-arm64": "4.63.1",
1624
- "@rollup/rollup-darwin-arm64": "4.63.1",
1625
- "@rollup/rollup-darwin-x64": "4.63.1",
1626
- "@rollup/rollup-freebsd-arm64": "4.63.1",
1627
- "@rollup/rollup-freebsd-x64": "4.63.1",
1628
- "@rollup/rollup-linux-arm-gnueabihf": "4.63.1",
1629
- "@rollup/rollup-linux-arm-musleabihf": "4.63.1",
1630
- "@rollup/rollup-linux-arm64-gnu": "4.63.1",
1631
- "@rollup/rollup-linux-arm64-musl": "4.63.1",
1632
- "@rollup/rollup-linux-loong64-gnu": "4.63.1",
1633
- "@rollup/rollup-linux-loong64-musl": "4.63.1",
1634
- "@rollup/rollup-linux-ppc64-gnu": "4.63.1",
1635
- "@rollup/rollup-linux-ppc64-musl": "4.63.1",
1636
- "@rollup/rollup-linux-riscv64-gnu": "4.63.1",
1637
- "@rollup/rollup-linux-riscv64-musl": "4.63.1",
1638
- "@rollup/rollup-linux-s390x-gnu": "4.63.1",
1639
- "@rollup/rollup-linux-x64-gnu": "4.63.1",
1640
- "@rollup/rollup-linux-x64-musl": "4.63.1",
1641
- "@rollup/rollup-openbsd-x64": "4.63.1",
1642
- "@rollup/rollup-openharmony-arm64": "4.63.1",
1643
- "@rollup/rollup-win32-arm64-msvc": "4.63.1",
1644
- "@rollup/rollup-win32-ia32-msvc": "4.63.1",
1645
- "@rollup/rollup-win32-x64-gnu": "4.63.1",
1646
- "@rollup/rollup-win32-x64-msvc": "4.63.1",
1647
- "fsevents": "~2.3.2"
1648
- }
1649
- },
1650
- "node_modules/scheduler": {
1651
- "version": "0.23.2",
1652
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
1653
- "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
1654
- "license": "MIT",
1655
- "dependencies": {
1656
- "loose-envify": "^1.1.0"
1657
- }
1658
- },
1659
- "node_modules/semver": {
1660
- "version": "6.3.1",
1661
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
1662
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
1663
- "dev": true,
1664
- "license": "ISC",
1665
- "bin": {
1666
- "semver": "bin/semver.js"
1667
- }
1668
- },
1669
- "node_modules/source-map-js": {
1670
- "version": "1.2.1",
1671
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1672
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1673
- "dev": true,
1674
- "license": "BSD-3-Clause",
1675
- "engines": {
1676
- "node": ">=0.10.0"
1677
- }
1678
- },
1679
- "node_modules/typescript": {
1680
- "version": "5.9.3",
1681
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
1682
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
1683
- "dev": true,
1684
- "license": "Apache-2.0",
1685
- "bin": {
1686
- "tsc": "bin/tsc",
1687
- "tsserver": "bin/tsserver"
1688
- },
1689
- "engines": {
1690
- "node": ">=14.17"
1691
- }
1692
- },
1693
- "node_modules/update-browserslist-db": {
1694
- "version": "1.3.2",
1695
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz",
1696
- "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==",
1697
- "dev": true,
1698
- "funding": [
1699
- {
1700
- "type": "opencollective",
1701
- "url": "https://opencollective.com/browserslist"
1702
- },
1703
- {
1704
- "type": "tidelift",
1705
- "url": "https://tidelift.com/funding/github/npm/browserslist"
1706
- },
1707
- {
1708
- "type": "github",
1709
- "url": "https://github.com/sponsors/ai"
1710
- }
1711
- ],
1712
- "license": "MIT",
1713
- "dependencies": {
1714
- "escalade": "^3.2.0",
1715
- "picocolors": "^1.1.1"
1716
- },
1717
- "bin": {
1718
- "update-browserslist-db": "cli.js"
1719
- },
1720
- "peerDependencies": {
1721
- "browserslist": ">= 4.21.0"
1722
- }
1723
- },
1724
- "node_modules/vite": {
1725
- "version": "5.4.21",
1726
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
1727
- "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
1728
- "dev": true,
1729
- "license": "MIT",
1730
- "dependencies": {
1731
- "esbuild": "^0.21.3",
1732
- "postcss": "^8.4.43",
1733
- "rollup": "^4.20.0"
1734
- },
1735
- "bin": {
1736
- "vite": "bin/vite.js"
1737
- },
1738
- "engines": {
1739
- "node": "^18.0.0 || >=20.0.0"
1740
- },
1741
- "funding": {
1742
- "url": "https://github.com/vitejs/vite?sponsor=1"
1743
- },
1744
- "optionalDependencies": {
1745
- "fsevents": "~2.3.3"
1746
- },
1747
- "peerDependencies": {
1748
- "@types/node": "^18.0.0 || >=20.0.0",
1749
- "less": "*",
1750
- "lightningcss": "^1.21.0",
1751
- "sass": "*",
1752
- "sass-embedded": "*",
1753
- "stylus": "*",
1754
- "sugarss": "*",
1755
- "terser": "^5.4.0"
1756
- },
1757
- "peerDependenciesMeta": {
1758
- "@types/node": {
1759
- "optional": true
1760
- },
1761
- "less": {
1762
- "optional": true
1763
- },
1764
- "lightningcss": {
1765
- "optional": true
1766
- },
1767
- "sass": {
1768
- "optional": true
1769
- },
1770
- "sass-embedded": {
1771
- "optional": true
1772
- },
1773
- "stylus": {
1774
- "optional": true
1775
- },
1776
- "sugarss": {
1777
- "optional": true
1778
- },
1779
- "terser": {
1780
- "optional": true
1781
- }
1782
- }
1783
- },
1784
- "node_modules/yallist": {
1785
- "version": "3.1.1",
1786
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
1787
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
1788
- "dev": true,
1789
- "license": "ISC"
1790
- }
1791
- }
1792
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/package.json DELETED
@@ -1,23 +0,0 @@
1
- {
2
- "name": "autoforge-frontend",
3
- "private": true,
4
- "version": "0.1.0",
5
- "type": "module",
6
- "scripts": {
7
- "dev": "vite",
8
- "build": "tsc -b && vite build",
9
- "preview": "vite preview"
10
- },
11
- "dependencies": {
12
- "react": "^18.3.1",
13
- "react-dom": "^18.3.1",
14
- "react-router-dom": "^6.28.0"
15
- },
16
- "devDependencies": {
17
- "@types/react": "^18.3.12",
18
- "@types/react-dom": "^18.3.1",
19
- "@vitejs/plugin-react": "^4.3.3",
20
- "typescript": "^5.6.3",
21
- "vite": "^5.4.11"
22
- }
23
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/App.tsx DELETED
@@ -1,35 +0,0 @@
1
- import { Navigate, Route, Routes } from "react-router-dom";
2
- import { AuthProvider, useAuth } from "./context/AuthContext";
3
- import Layout from "./components/Layout";
4
- import DashboardPage from "./pages/DashboardPage";
5
- import WorkflowPage from "./pages/WorkflowPage";
6
- import SettingsPage from "./pages/SettingsPage";
7
-
8
- function AuthWrapper({ children }: { children: React.ReactNode }) {
9
- const { user, loading } = useAuth();
10
- if (loading) return <div className="loading-fullscreen"><div className="spinner spinner-lg"></div><p>Initializing...</p></div>;
11
- if (!user) return <p>Failed to initialize guest session.</p>;
12
- return <>{children}</>;
13
- }
14
-
15
- export default function App() {
16
- return (
17
- <AuthProvider>
18
- <Routes>
19
- <Route
20
- path="/"
21
- element={
22
- <AuthWrapper>
23
- <Layout />
24
- </AuthWrapper>
25
- }
26
- >
27
- <Route index element={<Navigate to="/dashboard" replace />} />
28
- <Route path="dashboard" element={<DashboardPage />} />
29
- <Route path="workflows/:id" element={<WorkflowPage />} />
30
- <Route path="settings" element={<SettingsPage />} />
31
- </Route>
32
- </Routes>
33
- </AuthProvider>
34
- );
35
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/api/client.ts DELETED
@@ -1,107 +0,0 @@
1
- import type {
2
- ApiCredential,
3
- Attempt,
4
- ProviderInfo,
5
- Task,
6
- User,
7
- Workflow,
8
- WorkflowEvent,
9
- } from "../types";
10
-
11
- const API_BASE = import.meta.env.VITE_API_URL || "/api";
12
-
13
- class ApiError extends Error {
14
- status: number;
15
- constructor(message: string, status: number) {
16
- super(message);
17
- this.status = status;
18
- }
19
- }
20
-
21
- function getToken(): string | null {
22
- return localStorage.getItem("autoforge_token");
23
- }
24
-
25
- export function setToken(token: string | null) {
26
- if (token) localStorage.setItem("autoforge_token", token);
27
- else localStorage.removeItem("autoforge_token");
28
- }
29
-
30
- async function request<T>(path: string, options: RequestInit = {}): Promise<T> {
31
- const headers: Record<string, string> = {
32
- "Content-Type": "application/json",
33
- ...(options.headers as Record<string, string>),
34
- };
35
- const token = getToken();
36
- if (token) headers.Authorization = `Bearer ${token}`;
37
-
38
- const response = await fetch(`${API_BASE}${path}`, { ...options, headers });
39
- if (!response.ok) {
40
- const body = await response.json().catch(() => ({}));
41
- throw new ApiError(body.detail || response.statusText, response.status);
42
- }
43
- if (response.status === 204) return undefined as T;
44
- return response.json();
45
- }
46
-
47
- export const api = {
48
- signup: (email: string, username: string, password: string) =>
49
- request("/auth/signup", {
50
- method: "POST",
51
- body: JSON.stringify({ email, username, password }),
52
- }),
53
- login: (email: string, password: string) =>
54
- request<{ access_token: string }>("/auth/login", {
55
- method: "POST",
56
- body: JSON.stringify({ email, password }),
57
- }),
58
- guestLogin: () =>
59
- request<{ access_token: string }>("/auth/guest", {
60
- method: "POST",
61
- }),
62
- me: () => request<User>("/auth/me"),
63
- listProviders: () =>
64
- request<{ providers: ProviderInfo[] }>("/settings/providers"),
65
- listCredentials: () =>
66
- request<ApiCredential[]>("/settings/api-credentials"),
67
- saveCredential: (provider: string, api_key: string) =>
68
- request("/settings/api-credentials", {
69
- method: "POST",
70
- body: JSON.stringify({ provider, api_key }),
71
- }),
72
- deleteCredential: (id: number) =>
73
- request(`/settings/api-credentials/${id}`, { method: "DELETE" }),
74
- listWorkflows: () =>
75
- request<{ workflows: Workflow[]; total: number }>("/workflows"),
76
- createWorkflow: (data: {
77
- user_prompt: string;
78
- llm_provider: string;
79
- llm_model: string;
80
- api_key?: string;
81
- }) =>
82
- request<Workflow>("/workflows", {
83
- method: "POST",
84
- body: JSON.stringify(data),
85
- }),
86
- getWorkflow: (id: string) =>
87
- request<Workflow>(`/workflows/${id}`),
88
- startWorkflow: (id: string, api_key?: string) =>
89
- request<Workflow>(`/workflows/${id}/start`, {
90
- method: "POST",
91
- body: JSON.stringify({ api_key: api_key || null }),
92
- }),
93
- getTasks: (id: string) =>
94
- request<{ tasks: Task[] }>(`/workflows/${id}/tasks`),
95
- getEvents: (id: string, afterId = 0) =>
96
- request<{ events: WorkflowEvent[] }>(
97
- `/workflows/${id}/events?after_id=${afterId}`
98
- ),
99
- getAttempts: (id: string) =>
100
- request<{ attempts: Attempt[] }>(`/workflows/${id}/attempts`),
101
- streamUrl: (id: string, afterId = 0) => {
102
- const token = getToken();
103
- return `${API_BASE}/workflows/${id}/events/stream?token=${encodeURIComponent(token || "")}&after_id=${afterId}`;
104
- },
105
- };
106
-
107
- export { ApiError, getToken };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/components/AttemptsPanel.tsx DELETED
@@ -1,30 +0,0 @@
1
- import type { Attempt } from "../types";
2
-
3
- export default function AttemptsPanel({ attempts }: { attempts: Attempt[] }) {
4
- if (attempts.length === 0) return <p>No attempts recorded yet.</p>;
5
-
6
- return (
7
- <table className="table">
8
- <thead>
9
- <tr>
10
- <th>#</th>
11
- <th>Result</th>
12
- <th>Exit</th>
13
- <th>Created</th>
14
- <th>Error</th>
15
- </tr>
16
- </thead>
17
- <tbody>
18
- {attempts.map((a) => (
19
- <tr key={a.id}>
20
- <td>{a.attempt_number}</td>
21
- <td><span className={`status ${a.result || "UNKNOWN"}`}>{a.result || "—"}</span></td>
22
- <td>{a.exit_code ?? "—"}</td>
23
- <td>{new Date(a.created_at).toLocaleString()}</td>
24
- <td>{(a.error as { message?: string })?.message || "—"}</td>
25
- </tr>
26
- ))}
27
- </tbody>
28
- </table>
29
- );
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/components/CodeViewer.tsx DELETED
@@ -1,20 +0,0 @@
1
- export default function CodeViewer({
2
- files,
3
- }: {
4
- files: Record<string, { content: string; language?: string }> | null | undefined;
5
- }) {
6
- if (!files || Object.keys(files).length === 0) {
7
- return <p>No code generated yet.</p>;
8
- }
9
-
10
- return (
11
- <div>
12
- {Object.entries(files).map(([path, meta]) => (
13
- <div key={path} style={{ marginBottom: "1rem" }}>
14
- <h4>{path}</h4>
15
- <pre className="code-viewer">{meta.content}</pre>
16
- </div>
17
- ))}
18
- </div>
19
- );
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/components/ExecutionLogs.tsx DELETED
@@ -1,16 +0,0 @@
1
- import type { Attempt } from "../types";
2
-
3
- export default function ExecutionLogs({ attempts }: { attempts: Attempt[] }) {
4
- const latest = [...attempts].reverse().find((a) => a.stdout || a.stderr);
5
- if (!latest) return <p>No execution logs yet.</p>;
6
-
7
- return (
8
- <div>
9
- <h4>stdout</h4>
10
- <pre className="code-viewer">{latest.stdout || "(empty)"}</pre>
11
- <h4>stderr</h4>
12
- <pre className="code-viewer">{latest.stderr || "(empty)"}</pre>
13
- <p>Exit code: {latest.exit_code ?? "—"}</p>
14
- </div>
15
- );
16
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/components/Layout.tsx DELETED
@@ -1,34 +0,0 @@
1
- import { NavLink, Outlet, useNavigate } from "react-router-dom";
2
- import { useAuth } from "../context/AuthContext";
3
-
4
- export default function Layout() {
5
- const { user, logout } = useAuth();
6
- const navigate = useNavigate();
7
-
8
- return (
9
- <div className="app-shell">
10
- <aside className="sidebar">
11
- <h1>AutoForge</h1>
12
- <nav>
13
- <NavLink to="/dashboard" className={({ isActive }) => (isActive ? "active" : "")}>
14
- Dashboard
15
- </NavLink>
16
- <NavLink to="/settings" className={({ isActive }) => (isActive ? "active" : "")}>
17
- API Settings
18
- </NavLink>
19
- <button
20
- onClick={() => {
21
- logout();
22
- navigate("/dashboard");
23
- }}
24
- >
25
- Reset Session ({user?.username})
26
- </button>
27
- </nav>
28
- </aside>
29
- <main className="main-content">
30
- <Outlet />
31
- </main>
32
- </div>
33
- );
34
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/components/TaskGraph.tsx DELETED
@@ -1,51 +0,0 @@
1
- import type { Task } from "../types";
2
-
3
- interface PlannerTask {
4
- id: string;
5
- type: string;
6
- depends_on: string[];
7
- }
8
-
9
- export default function TaskGraph({
10
- plannerOutput,
11
- tasks,
12
- }: {
13
- plannerOutput: Record<string, unknown> | null;
14
- tasks: Task[];
15
- }) {
16
- const plannerTasks = (plannerOutput?.tasks as PlannerTask[]) || [];
17
- const taskMap = new Map(tasks.map((t) => [t.task_key, t]));
18
-
19
- if (plannerTasks.length === 0 && tasks.length > 0) {
20
- return (
21
- <div className="task-graph">
22
- {tasks.map((task) => (
23
- <div className={`task-node ${task.status.toLowerCase()}`} key={task.task_key}>
24
- <div><strong>{task.task_key}</strong></div>
25
- <div>{task.task_type}</div>
26
- <span className={`status ${task.status}`}>{task.status}</span>
27
- </div>
28
- ))}
29
- </div>
30
- );
31
- }
32
-
33
- return (
34
- <div className="task-graph">
35
- {plannerTasks.map((pt) => {
36
- const live = taskMap.get(pt.id);
37
- const status = live?.status || "PENDING";
38
- return (
39
- <div className={`task-node ${status.toLowerCase()}`} key={pt.id}>
40
- <div><strong>{pt.id}</strong></div>
41
- <div>{pt.type}</div>
42
- <div style={{ fontSize: "0.8rem", color: "#7f92ab" }}>
43
- deps: {pt.depends_on.length ? pt.depends_on.join(", ") : "none"}
44
- </div>
45
- <span className={`status ${status}`}>{status}</span>
46
- </div>
47
- );
48
- })}
49
- </div>
50
- );
51
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/components/WorkflowTimeline.tsx DELETED
@@ -1,127 +0,0 @@
1
- import { useState, useEffect } from "react";
2
- import type { WorkflowEvent } from "../types";
3
-
4
- const EVENT_ICONS: Record<string, string> = {
5
- WORKFLOW_STARTED: "▶",
6
- TASK_CREATED: "+",
7
- TASK_READY: "◎",
8
- TASK_STARTED: "→",
9
- LLM_CALLED: "🤖",
10
- PLANNER_COMPLETED: "📋",
11
- CODE_GENERATED: "📝",
12
- TESTS_GENERATED: "🧪",
13
- STATIC_ANALYSIS_STARTED: "🔍",
14
- STATIC_ANALYSIS_COMPLETED: "✓",
15
- CONTAINER_STARTED: "🐳",
16
- TEST_STARTED: "🏃",
17
- TESTS_RUNNING: "🏃",
18
- TEST_FAILED: "✗",
19
- TEST_PASSED: "✓",
20
- RETRY_STARTED: "↻",
21
- FAILURE_DIAGNOSED: "🔎",
22
- REPAIR_GENERATED: "🔧",
23
- TASK_COMPLETED: "✓",
24
- TASK_FAILED: "✗",
25
- WORKFLOW_COMPLETED: "★",
26
- WORKFLOW_FAILED: "✗",
27
- };
28
-
29
- export default function WorkflowTimeline({ events }: { events: WorkflowEvent[] }) {
30
- const [isOpen, setIsOpen] = useState(true);
31
-
32
- const isComplete = events.some(e => e.event_type === "WORKFLOW_COMPLETED" || e.event_type === "WORKFLOW_FAILED");
33
-
34
- useEffect(() => {
35
- if (isComplete) setIsOpen(false);
36
- }, [isComplete]);
37
-
38
- return (
39
- <details
40
- open={isOpen}
41
- onToggle={(e) => setIsOpen(e.currentTarget.open)}
42
- style={{
43
- background: "var(--bg-elevated)",
44
- borderRadius: "var(--radius-md)",
45
- border: isComplete ? "1px solid var(--border-subtle)" : "1px solid rgba(99, 102, 241, 0.4)",
46
- boxShadow: isComplete ? "none" : "0 0 20px rgba(99, 102, 241, 0.25)",
47
- marginBottom: "2rem",
48
- overflow: "hidden",
49
- transition: "all 0.3s ease"
50
- }}
51
- >
52
- <summary style={{
53
- padding: "1rem 1.5rem",
54
- cursor: "pointer",
55
- fontWeight: 600,
56
- display: "flex",
57
- alignItems: "center",
58
- justifyContent: "space-between",
59
- gap: "0.75rem",
60
- listStyle: "none",
61
- borderBottom: isOpen ? "1px solid var(--border-subtle)" : "none",
62
- userSelect: "none",
63
- background: isComplete ? "transparent" : "linear-gradient(90deg, rgba(99, 102, 241, 0.05) 0%, transparent 100%)"
64
- }}>
65
- <div style={{ display: "flex", alignItems: "center", gap: "0.75rem" }}>
66
- <span style={{ transition: "transform 0.2s", transform: isOpen ? "rotate(90deg)" : "rotate(0deg)", display: "inline-block" }}>▶</span>
67
- {!isComplete && <span className="radar-dot green"></span>}
68
- <span>{isComplete ? "Agent completed execution" : "Agent is thinking & executing..."}</span>
69
- </div>
70
- {!isComplete && (
71
- <span style={{ fontSize: "0.8rem", color: "#6366f1", display: "flex", alignItems: "center", gap: "0.3rem" }}>
72
- LIVE <span className="thinking-dots"><span></span><span></span><span></span></span>
73
- </span>
74
- )}
75
- </summary>
76
-
77
- <div style={{ padding: "1.5rem", maxHeight: "450px", overflowY: "auto" }}>
78
- <ul className="timeline">
79
- {events.map((event) => (
80
- <li key={event.id} style={{ marginBottom: "1rem", display: "flex", gap: "1rem", alignItems: "flex-start" }}>
81
- <span className="icon" style={{
82
- background: "var(--bg-surface)",
83
- width: "32px", height: "32px",
84
- display: "flex", alignItems: "center", justifyContent: "center",
85
- borderRadius: "50%",
86
- border: "1px solid var(--border-subtle)",
87
- flexShrink: 0
88
- }}>
89
- {EVENT_ICONS[event.event_type] || "•"}
90
- </span>
91
- <div>
92
- <strong style={{ display: "block", color: "var(--text-primary)", fontSize: "0.9rem" }}>
93
- {event.event_type.replace(/_/g, " ")}
94
- </strong>
95
- <div style={{ color: "var(--text-secondary)", fontSize: "0.85rem", marginTop: "0.2rem" }}>{event.message}</div>
96
- <div className="time" style={{ color: "var(--text-muted)", fontSize: "0.75rem", marginTop: "0.2rem" }}>
97
- {new Date(event.timestamp).toLocaleTimeString()}
98
- </div>
99
- </div>
100
- </li>
101
- ))}
102
-
103
- {!isComplete && (
104
- <li style={{ marginTop: "1rem", listStyle: "none" }}>
105
- <div className="live-thinking-pulse">
106
- <span className="radar-dot"></span>
107
- <div style={{ flex: 1 }}>
108
- <div style={{ display: "flex", alignItems: "center", gap: "0.4rem" }}>
109
- <span>Agent is working on the autonomous loop</span>
110
- <span className="thinking-dots"><span></span><span></span><span></span></span>
111
- </div>
112
- <div style={{ fontSize: "0.8rem", color: "var(--text-muted)", marginTop: "0.2rem" }}>
113
- Generating code, compiling DAG graph, executing tasks & verifying...
114
- </div>
115
- <div style={{ marginTop: "0.6rem" }}>
116
- <div className="thinking-shimmer-progress"></div>
117
- </div>
118
- </div>
119
- </div>
120
- </li>
121
- )}
122
- {events.length === 0 && isComplete && <li>No events recorded.</li>}
123
- </ul>
124
- </div>
125
- </details>
126
- );
127
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/context/AuthContext.tsx DELETED
@@ -1,51 +0,0 @@
1
- import { createContext, useContext, useEffect, useState, ReactNode } from "react";
2
- import { api, setToken, getToken } from "../api/client";
3
- import type { User } from "../types";
4
-
5
- interface AuthContextValue {
6
- user: User | null;
7
- loading: boolean;
8
- logout: () => void;
9
- }
10
-
11
- const AuthContext = createContext<AuthContextValue | null>(null);
12
-
13
- export function AuthProvider({ children }: { children: ReactNode }) {
14
- const [user, setUser] = useState<User | null>(null);
15
- const [loading, setLoading] = useState(true);
16
-
17
- const logout = () => {
18
- setToken(null);
19
- setUser(null);
20
- };
21
-
22
- useEffect(() => {
23
- const initializeAuth = async () => {
24
- try {
25
- if (!getToken()) {
26
- const { access_token } = await api.guestLogin();
27
- setToken(access_token);
28
- }
29
- setUser(await api.me());
30
- } catch (err) {
31
- console.error("Failed to authenticate guest", err);
32
- setToken(null);
33
- } finally {
34
- setLoading(false);
35
- }
36
- };
37
- initializeAuth();
38
- }, []);
39
-
40
- return (
41
- <AuthContext.Provider value={{ user, loading, logout }}>
42
- {children}
43
- </AuthContext.Provider>
44
- );
45
- }
46
-
47
- export function useAuth() {
48
- const ctx = useContext(AuthContext);
49
- if (!ctx) throw new Error("useAuth must be used within AuthProvider");
50
- return ctx;
51
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/hooks/useWorkflowLive.ts DELETED
@@ -1,60 +0,0 @@
1
- import { useEffect, useState, useRef } from "react";
2
- import { api } from "../api/client";
3
- import type { WorkflowEvent } from "../types";
4
-
5
- export function useWorkflowLive(workflowId: string, isActive: boolean) {
6
- const [events, setEvents] = useState<WorkflowEvent[]>([]);
7
- const eventSourceRef = useRef<EventSource | null>(null);
8
-
9
- useEffect(() => {
10
- if (!workflowId) return;
11
- let cancelled = false;
12
-
13
- const startStreaming = (afterId: number) => {
14
- if (cancelled || !isActive) return;
15
-
16
- const evtSource = new EventSource(api.streamUrl(workflowId, afterId));
17
- eventSourceRef.current = evtSource;
18
-
19
- evtSource.onmessage = (e) => {
20
- const payload = JSON.parse(e.data);
21
- if (payload.event_type === "STREAM_END") {
22
- evtSource.close();
23
- return;
24
- }
25
- setEvents((prev) => {
26
- if (prev.find((x) => x.id === payload.id)) return prev;
27
- return [...prev, payload];
28
- });
29
- };
30
-
31
- evtSource.onerror = () => {
32
- evtSource.close();
33
- };
34
- };
35
-
36
- const loadAll = async () => {
37
- try {
38
- const data = await api.getEvents(workflowId, 0);
39
- if (cancelled) return;
40
- setEvents(data.events);
41
- const lastId = data.events.length ? data.events[data.events.length - 1].id : 0;
42
- startStreaming(lastId);
43
- } catch (err) {
44
- console.error("Failed to load initial events", err);
45
- }
46
- };
47
-
48
- loadAll();
49
-
50
- return () => {
51
- cancelled = true;
52
- if (eventSourceRef.current) {
53
- eventSourceRef.current.close();
54
- eventSourceRef.current = null;
55
- }
56
- };
57
- }, [workflowId, isActive]);
58
-
59
- return { events, setEvents };
60
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/index.css DELETED
@@ -1,1203 +0,0 @@
1
- /* ============================================================
2
- AutoForge – Design System
3
- ============================================================ */
4
-
5
- :root {
6
- /* Color palette - Light Theme */
7
- --bg-base: #f9fafb;
8
- --bg-surface: #ffffff;
9
- --bg-elevated: #f3f4f6;
10
- --bg-sidebar: #ffffff;
11
- --bg-input: #ffffff;
12
-
13
- --border-subtle: #e5e7eb;
14
- --border-default: #d1d5db;
15
- --border-strong: #9ca3af;
16
-
17
- --text-primary: #111827;
18
- --text-secondary: #374151;
19
- --text-muted: #6b7280;
20
- --text-inverse: #ffffff;
21
-
22
- --accent-primary: #000000;
23
- --accent-primary-hover: #374151;
24
- --accent-primary-glow: rgba(0, 0, 0, 0.08);
25
-
26
- --accent-success: #059669;
27
- --accent-success-bg: rgba(5, 150, 105, 0.12);
28
- --accent-warning: #d97706;
29
- --accent-warning-bg: rgba(217, 119, 6, 0.12);
30
- --accent-danger: #dc2626;
31
- --accent-danger-bg: rgba(220, 38, 38, 0.12);
32
- --accent-info: #4f46e5;
33
- --accent-info-bg: rgba(79, 70, 229, 0.12);
34
-
35
- --sidebar-width: 248px;
36
- --radius-sm: 6px;
37
- --radius-md: 10px;
38
- --radius-lg: 14px;
39
- --radius-xl: 20px;
40
-
41
- --shadow-sm: 0 1px 3px rgba(0,0,0,0.05);
42
- --shadow-md: 0 4px 16px rgba(0,0,0,0.08);
43
- --shadow-lg: 0 12px 40px rgba(0,0,0,0.12);
44
- --shadow-glow: 0 0 24px rgba(0,0,0,0.06);
45
-
46
- --transition-fast: 120ms ease;
47
- --transition-base: 200ms ease;
48
- --transition-slow: 350ms ease;
49
-
50
- /* Font */
51
- --font-body: 'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif;
52
- --font-mono: 'JetBrains Mono', 'Cascadia Code', Consolas, monospace;
53
- }
54
-
55
- /* ── Reset ── */
56
- *, *::before, *::after {
57
- box-sizing: border-box;
58
- margin: 0;
59
- padding: 0;
60
- }
61
-
62
- html {
63
- scroll-behavior: smooth;
64
- }
65
-
66
- body {
67
- font-family: var(--font-body);
68
- background: var(--bg-base);
69
- color: var(--text-primary);
70
- min-height: 100vh;
71
- line-height: 1.6;
72
- -webkit-font-smoothing: antialiased;
73
- -moz-osx-font-smoothing: grayscale;
74
- }
75
-
76
- a {
77
- color: var(--accent-primary);
78
- text-decoration: none;
79
- transition: color var(--transition-fast);
80
- }
81
- a:hover { color: #60a5fa; text-decoration: underline; }
82
-
83
- /* ── Scrollbar ── */
84
- ::-webkit-scrollbar { width: 6px; height: 6px; }
85
- ::-webkit-scrollbar-track { background: transparent; }
86
- ::-webkit-scrollbar-thumb { background: var(--border-default); border-radius: 999px; }
87
- ::-webkit-scrollbar-thumb:hover { background: var(--border-strong); }
88
-
89
- /* ============================================================
90
- LAYOUT
91
- ============================================================ */
92
-
93
- .app-shell {
94
- display: grid;
95
- grid-template-columns: var(--sidebar-width) 1fr;
96
- min-height: 100vh;
97
- }
98
-
99
- /* ── Sidebar ── */
100
- .sidebar {
101
- background: var(--bg-sidebar);
102
- border-right: 1px solid var(--border-subtle);
103
- display: flex;
104
- flex-direction: column;
105
- padding: 0;
106
- position: sticky;
107
- top: 0;
108
- height: 100vh;
109
- overflow: hidden;
110
- }
111
-
112
- .sidebar-brand {
113
- display: flex;
114
- align-items: center;
115
- gap: 0.65rem;
116
- padding: 1.5rem 1.25rem 1.25rem;
117
- border-bottom: 1px solid var(--border-subtle);
118
- }
119
-
120
- .sidebar-brand-icon {
121
- width: 32px;
122
- height: 32px;
123
- border-radius: var(--radius-sm);
124
- background: linear-gradient(135deg, var(--accent-primary), #6366f1);
125
- display: flex;
126
- align-items: center;
127
- justify-content: center;
128
- font-size: 1rem;
129
- font-weight: 700;
130
- color: white;
131
- box-shadow: 0 0 14px rgba(59, 130, 246, 0.35);
132
- flex-shrink: 0;
133
- }
134
-
135
- .sidebar-brand-text {
136
- font-size: 1rem;
137
- font-weight: 700;
138
- letter-spacing: -0.01em;
139
- background: linear-gradient(135deg, #60a5fa, #a5b4fc);
140
- -webkit-background-clip: text;
141
- -webkit-text-fill-color: transparent;
142
- background-clip: text;
143
- }
144
-
145
- .sidebar-nav {
146
- flex: 1;
147
- padding: 1rem 0.75rem;
148
- display: flex;
149
- flex-direction: column;
150
- gap: 2px;
151
- overflow-y: auto;
152
- }
153
-
154
- .sidebar-section-label {
155
- font-size: 0.65rem;
156
- font-weight: 600;
157
- letter-spacing: 0.08em;
158
- text-transform: uppercase;
159
- color: var(--text-muted);
160
- padding: 0.75rem 0.5rem 0.3rem;
161
- }
162
-
163
- .sidebar a,
164
- .sidebar-nav-btn {
165
- display: flex;
166
- align-items: center;
167
- gap: 0.65rem;
168
- width: 100%;
169
- padding: 0.6rem 0.75rem;
170
- border-radius: var(--radius-md);
171
- border: none;
172
- background: transparent;
173
- color: var(--text-secondary);
174
- cursor: pointer;
175
- font-size: 0.875rem;
176
- font-weight: 500;
177
- font-family: var(--font-body);
178
- text-align: left;
179
- transition: background var(--transition-fast), color var(--transition-fast);
180
- text-decoration: none;
181
- }
182
-
183
- .sidebar a:hover,
184
- .sidebar-nav-btn:hover {
185
- background: var(--bg-elevated);
186
- color: var(--text-primary);
187
- text-decoration: none;
188
- }
189
-
190
- .sidebar a.active {
191
- background: var(--accent-primary-glow);
192
- color: #93c5fd;
193
- box-shadow: inset 0 0 0 1px rgba(59, 130, 246, 0.2);
194
- }
195
-
196
- .sidebar a.active .nav-icon { color: var(--accent-primary); }
197
-
198
- .nav-icon {
199
- font-size: 1rem;
200
- width: 1.1rem;
201
- text-align: center;
202
- flex-shrink: 0;
203
- color: var(--text-muted);
204
- transition: color var(--transition-fast);
205
- }
206
-
207
- .sidebar a.active .nav-icon,
208
- .sidebar a:hover .nav-icon {
209
- color: inherit;
210
- }
211
-
212
- .sidebar-footer {
213
- padding: 0.75rem;
214
- border-top: 1px solid var(--border-subtle);
215
- }
216
-
217
- .user-pill {
218
- display: flex;
219
- align-items: center;
220
- gap: 0.65rem;
221
- padding: 0.6rem 0.75rem;
222
- border-radius: var(--radius-md);
223
- background: var(--bg-elevated);
224
- cursor: default;
225
- }
226
-
227
- .user-avatar {
228
- width: 28px;
229
- height: 28px;
230
- border-radius: 50%;
231
- background: linear-gradient(135deg, var(--accent-primary), #6366f1);
232
- display: flex;
233
- align-items: center;
234
- justify-content: center;
235
- font-size: 0.75rem;
236
- font-weight: 700;
237
- color: white;
238
- flex-shrink: 0;
239
- }
240
-
241
- .user-info { flex: 1; min-width: 0; }
242
- .user-name {
243
- font-size: 0.8rem;
244
- font-weight: 600;
245
- color: var(--text-primary);
246
- white-space: nowrap;
247
- overflow: hidden;
248
- text-overflow: ellipsis;
249
- }
250
- .user-email {
251
- font-size: 0.68rem;
252
- color: var(--text-muted);
253
- white-space: nowrap;
254
- overflow: hidden;
255
- text-overflow: ellipsis;
256
- }
257
-
258
- .logout-btn {
259
- background: transparent;
260
- border: none;
261
- cursor: pointer;
262
- color: var(--text-muted);
263
- padding: 0.2rem;
264
- border-radius: var(--radius-sm);
265
- font-size: 0.85rem;
266
- transition: color var(--transition-fast);
267
- display: flex;
268
- align-items: center;
269
- }
270
- .logout-btn:hover { color: var(--accent-danger); }
271
-
272
- /* ── Main content ── */
273
- .main-content {
274
- padding: 2rem 2.5rem;
275
- min-height: 100vh;
276
- overflow-y: auto;
277
- }
278
-
279
- /* ============================================================
280
- PAGE HEADERS
281
- ============================================================ */
282
-
283
- .page-header {
284
- display: flex;
285
- align-items: flex-start;
286
- justify-content: space-between;
287
- gap: 1rem;
288
- margin-bottom: 1.75rem;
289
- }
290
-
291
- .page-title {
292
- font-size: 1.5rem;
293
- font-weight: 700;
294
- letter-spacing: -0.02em;
295
- color: var(--text-primary);
296
- line-height: 1.3;
297
- }
298
-
299
- .page-subtitle {
300
- font-size: 0.875rem;
301
- color: var(--text-secondary);
302
- margin-top: 0.25rem;
303
- }
304
-
305
- /* ============================================================
306
- CARDS
307
- ============================================================ */
308
-
309
- .card {
310
- background: var(--bg-surface);
311
- border: 1px solid var(--border-subtle);
312
- border-radius: var(--radius-lg);
313
- padding: 1.5rem;
314
- margin-bottom: 1.25rem;
315
- transition: border-color var(--transition-base);
316
- }
317
-
318
- .card:hover { border-color: var(--border-default); }
319
-
320
- .card-header {
321
- display: flex;
322
- align-items: center;
323
- justify-content: space-between;
324
- margin-bottom: 1.25rem;
325
- }
326
-
327
- .card-title {
328
- font-size: 0.95rem;
329
- font-weight: 600;
330
- color: var(--text-primary);
331
- }
332
-
333
- /* ============================================================
334
- FORMS
335
- ============================================================ */
336
-
337
- .form-group {
338
- margin-bottom: 1.1rem;
339
- }
340
-
341
- label,
342
- .form-label {
343
- display: block;
344
- margin-bottom: 0.4rem;
345
- color: var(--text-secondary);
346
- font-size: 0.8rem;
347
- font-weight: 500;
348
- letter-spacing: 0.01em;
349
- }
350
-
351
- input,
352
- select,
353
- textarea {
354
- width: 100%;
355
- padding: 0.65rem 0.9rem;
356
- border-radius: var(--radius-md);
357
- border: 1px solid var(--border-default);
358
- background: var(--bg-input);
359
- color: var(--text-primary);
360
- font-family: var(--font-body);
361
- font-size: 0.9rem;
362
- transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
363
- outline: none;
364
- }
365
-
366
- input:focus,
367
- select:focus,
368
- textarea:focus {
369
- border-color: var(--accent-primary);
370
- box-shadow: 0 0 0 3px var(--accent-primary-glow);
371
- }
372
-
373
- input::placeholder,
374
- textarea::placeholder {
375
- color: var(--text-muted);
376
- }
377
-
378
- textarea {
379
- min-height: 130px;
380
- resize: vertical;
381
- line-height: 1.6;
382
- }
383
-
384
- select {
385
- cursor: pointer;
386
- appearance: none;
387
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%238aa0bd' stroke-width='2'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
388
- background-repeat: no-repeat;
389
- background-position: right 0.75rem center;
390
- padding-right: 2.5rem;
391
- }
392
-
393
- /* ============================================================
394
- BUTTONS
395
- ============================================================ */
396
-
397
- button.primary,
398
- .btn-primary {
399
- display: inline-flex;
400
- align-items: center;
401
- justify-content: center;
402
- gap: 0.5rem;
403
- background: var(--accent-primary);
404
- color: white;
405
- border: none;
406
- border-radius: var(--radius-md);
407
- padding: 0.65rem 1.35rem;
408
- font-weight: 600;
409
- font-size: 0.875rem;
410
- font-family: var(--font-body);
411
- cursor: pointer;
412
- transition: background var(--transition-fast), box-shadow var(--transition-fast), transform var(--transition-fast);
413
- white-space: nowrap;
414
- }
415
-
416
- button.primary:hover,
417
- .btn-primary:hover {
418
- background: var(--accent-primary-hover);
419
- box-shadow: 0 4px 12px rgba(59, 130, 246, 0.35);
420
- transform: translateY(-1px);
421
- }
422
-
423
- button.primary:active,
424
- .btn-primary:active {
425
- transform: translateY(0);
426
- }
427
-
428
- button.primary:disabled,
429
- .btn-primary:disabled {
430
- opacity: 0.5;
431
- cursor: not-allowed;
432
- transform: none;
433
- box-shadow: none;
434
- }
435
-
436
- button.secondary,
437
- .btn-secondary {
438
- display: inline-flex;
439
- align-items: center;
440
- justify-content: center;
441
- gap: 0.5rem;
442
- background: var(--bg-elevated);
443
- color: var(--text-secondary);
444
- border: 1px solid var(--border-default);
445
- border-radius: var(--radius-md);
446
- padding: 0.6rem 1rem;
447
- font-size: 0.875rem;
448
- font-family: var(--font-body);
449
- cursor: pointer;
450
- transition: all var(--transition-fast);
451
- white-space: nowrap;
452
- }
453
-
454
- button.secondary:hover,
455
- .btn-secondary:hover {
456
- color: var(--text-primary);
457
- border-color: var(--border-strong);
458
- background: var(--border-subtle);
459
- }
460
-
461
- .btn-danger {
462
- display: inline-flex;
463
- align-items: center;
464
- gap: 0.4rem;
465
- background: transparent;
466
- color: var(--accent-danger);
467
- border: 1px solid rgba(239, 68, 68, 0.3);
468
- border-radius: var(--radius-md);
469
- padding: 0.45rem 0.85rem;
470
- font-size: 0.8rem;
471
- font-family: var(--font-body);
472
- cursor: pointer;
473
- transition: all var(--transition-fast);
474
- }
475
- .btn-danger:hover {
476
- background: var(--accent-danger-bg);
477
- border-color: var(--accent-danger);
478
- }
479
-
480
- /* ============================================================
481
- STATUS BADGES
482
- ============================================================ */
483
-
484
- .status {
485
- display: inline-flex;
486
- align-items: center;
487
- gap: 0.3rem;
488
- padding: 0.25rem 0.65rem;
489
- border-radius: 999px;
490
- font-size: 0.72rem;
491
- font-weight: 600;
492
- letter-spacing: 0.03em;
493
- text-transform: uppercase;
494
- }
495
-
496
- .status::before {
497
- content: '';
498
- width: 5px;
499
- height: 5px;
500
- border-radius: 50%;
501
- background: currentColor;
502
- }
503
-
504
- .status.SUCCESS { background: var(--accent-success-bg); color: #34d399; }
505
- .status.FAILED { background: var(--accent-danger-bg); color: #f87171; }
506
- .status.RUNNING { background: var(--accent-info-bg); color: #818cf8; animation: pulse-status 2s infinite; }
507
- .status.CREATED { background: var(--accent-warning-bg); color: #fbbf24; }
508
- .status.PENDING { background: rgba(107, 114, 128, 0.15); color: #9ca3af; }
509
- .status.CANCELLED { background: rgba(107, 114, 128, 0.12); color: #6b7280; }
510
-
511
- @keyframes pulse-status {
512
- 0%, 100% { opacity: 1; }
513
- 50% { opacity: 0.65; }
514
- }
515
-
516
- /* ============================================================
517
- TABLES
518
- ============================================================ */
519
-
520
- .table {
521
- width: 100%;
522
- border-collapse: collapse;
523
- font-size: 0.875rem;
524
- }
525
-
526
- .table th {
527
- text-align: left;
528
- padding: 0.65rem 1rem;
529
- color: var(--text-muted);
530
- font-size: 0.72rem;
531
- font-weight: 600;
532
- letter-spacing: 0.06em;
533
- text-transform: uppercase;
534
- border-bottom: 1px solid var(--border-subtle);
535
- }
536
-
537
- .table td {
538
- padding: 0.85rem 1rem;
539
- border-bottom: 1px solid var(--border-subtle);
540
- color: var(--text-secondary);
541
- vertical-align: middle;
542
- }
543
-
544
- .table tbody tr {
545
- transition: background var(--transition-fast);
546
- }
547
-
548
- .table tbody tr:hover td {
549
- background: var(--bg-elevated);
550
- color: var(--text-primary);
551
- }
552
-
553
- .table tbody tr:last-child td {
554
- border-bottom: none;
555
- }
556
-
557
- /* ============================================================
558
- TABS
559
- ============================================================ */
560
-
561
- .tabs {
562
- display: flex;
563
- gap: 4px;
564
- margin-bottom: 1.25rem;
565
- background: var(--bg-sidebar);
566
- border: 1px solid var(--border-subtle);
567
- border-radius: var(--radius-md);
568
- padding: 4px;
569
- flex-wrap: wrap;
570
- }
571
-
572
- .tabs button {
573
- background: transparent;
574
- border: none;
575
- color: var(--text-secondary);
576
- padding: 0.45rem 0.9rem;
577
- border-radius: var(--radius-sm);
578
- cursor: pointer;
579
- font-size: 0.82rem;
580
- font-weight: 500;
581
- font-family: var(--font-body);
582
- transition: all var(--transition-fast);
583
- white-space: nowrap;
584
- }
585
-
586
- .tabs button:hover {
587
- background: var(--bg-elevated);
588
- color: var(--text-primary);
589
- }
590
-
591
- .tabs button.active {
592
- background: var(--bg-surface);
593
- color: var(--text-primary);
594
- box-shadow: var(--shadow-sm);
595
- border: 1px solid var(--border-default);
596
- }
597
-
598
- /* ============================================================
599
- AUTH PAGES
600
- ============================================================ */
601
-
602
- .auth-page {
603
- min-height: 100vh;
604
- display: flex;
605
- align-items: center;
606
- justify-content: center;
607
- background: var(--bg-base);
608
- position: relative;
609
- overflow: hidden;
610
- }
611
-
612
- .auth-page::before {
613
- content: '';
614
- position: absolute;
615
- top: -20%;
616
- left: 50%;
617
- transform: translateX(-50%);
618
- width: 600px;
619
- height: 600px;
620
- background: radial-gradient(circle, rgba(59, 130, 246, 0.07) 0%, transparent 70%);
621
- pointer-events: none;
622
- }
623
-
624
- .auth-card {
625
- width: min(440px, 94vw);
626
- padding: 2.25rem;
627
- background: var(--bg-surface);
628
- border: 1px solid var(--border-subtle);
629
- border-radius: var(--radius-xl);
630
- box-shadow: var(--shadow-lg);
631
- position: relative;
632
- }
633
-
634
- .auth-header {
635
- text-align: center;
636
- margin-bottom: 2rem;
637
- }
638
-
639
- .auth-logo {
640
- display: inline-flex;
641
- align-items: center;
642
- justify-content: center;
643
- width: 48px;
644
- height: 48px;
645
- border-radius: var(--radius-md);
646
- background: linear-gradient(135deg, var(--accent-primary), #6366f1);
647
- font-size: 1.4rem;
648
- font-weight: 800;
649
- color: white;
650
- margin-bottom: 1rem;
651
- box-shadow: 0 0 24px rgba(59, 130, 246, 0.35);
652
- }
653
-
654
- .auth-title {
655
- font-size: 1.35rem;
656
- font-weight: 700;
657
- letter-spacing: -0.02em;
658
- color: var(--text-primary);
659
- margin-bottom: 0.35rem;
660
- }
661
-
662
- .auth-subtitle {
663
- font-size: 0.85rem;
664
- color: var(--text-secondary);
665
- }
666
-
667
- .auth-footer {
668
- text-align: center;
669
- margin-top: 1.5rem;
670
- font-size: 0.875rem;
671
- color: var(--text-secondary);
672
- }
673
-
674
- /* ============================================================
675
- ALERTS & MESSAGES
676
- ============================================================ */
677
-
678
- .alert {
679
- display: flex;
680
- align-items: flex-start;
681
- gap: 0.65rem;
682
- padding: 0.85rem 1rem;
683
- border-radius: var(--radius-md);
684
- font-size: 0.875rem;
685
- margin-bottom: 1rem;
686
- }
687
-
688
- .alert-error {
689
- background: var(--accent-danger-bg);
690
- border: 1px solid rgba(239, 68, 68, 0.25);
691
- color: #fca5a5;
692
- }
693
-
694
- .alert-success {
695
- background: var(--accent-success-bg);
696
- border: 1px solid rgba(16, 185, 129, 0.25);
697
- color: #6ee7b7;
698
- }
699
-
700
- .alert-info {
701
- background: var(--accent-info-bg);
702
- border: 1px solid rgba(99, 102, 241, 0.25);
703
- color: #a5b4fc;
704
- }
705
-
706
- /* Legacy error class */
707
- .error {
708
- background: var(--accent-danger-bg);
709
- border: 1px solid rgba(239, 68, 68, 0.25);
710
- color: #fca5a5;
711
- padding: 0.75rem 1rem;
712
- border-radius: var(--radius-md);
713
- font-size: 0.875rem;
714
- margin-bottom: 1rem;
715
- }
716
-
717
- /* ============================================================
718
- LOADING STATES
719
- ============================================================ */
720
-
721
- .spinner {
722
- width: 18px;
723
- height: 18px;
724
- border: 2px solid rgba(255,255,255,0.25);
725
- border-top-color: white;
726
- border-radius: 50%;
727
- animation: spin 0.7s linear infinite;
728
- flex-shrink: 0;
729
- }
730
-
731
- .spinner-sm {
732
- width: 14px;
733
- height: 14px;
734
- border-width: 2px;
735
- }
736
-
737
- .spinner-lg {
738
- width: 36px;
739
- height: 36px;
740
- border-width: 3px;
741
- border-color: var(--border-default);
742
- border-top-color: var(--accent-primary);
743
- }
744
-
745
- @keyframes spin {
746
- to { transform: rotate(360deg); }
747
- }
748
-
749
- .loading-overlay {
750
- display: flex;
751
- flex-direction: column;
752
- align-items: center;
753
- justify-content: center;
754
- gap: 1rem;
755
- padding: 4rem;
756
- color: var(--text-muted);
757
- font-size: 0.875rem;
758
- }
759
-
760
- .loading-fullscreen {
761
- min-height: 100vh;
762
- display: flex;
763
- align-items: center;
764
- justify-content: center;
765
- background: var(--bg-base);
766
- flex-direction: column;
767
- gap: 1rem;
768
- }
769
-
770
- /* Skeleton loading */
771
- .skeleton {
772
- background: linear-gradient(90deg, var(--bg-elevated) 25%, var(--border-subtle) 50%, var(--bg-elevated) 75%);
773
- background-size: 200% 100%;
774
- animation: shimmer 1.5s infinite;
775
- border-radius: var(--radius-sm);
776
- }
777
-
778
- @keyframes shimmer {
779
- 0% { background-position: 200% 0; }
780
- 100% { background-position: -200% 0; }
781
- }
782
-
783
- /* ============================================================
784
- EMPTY STATES
785
- ============================================================ */
786
-
787
- .empty-state {
788
- display: flex;
789
- flex-direction: column;
790
- align-items: center;
791
- justify-content: center;
792
- gap: 0.75rem;
793
- padding: 3.5rem 2rem;
794
- color: var(--text-muted);
795
- text-align: center;
796
- }
797
-
798
- .empty-state-icon {
799
- font-size: 2.5rem;
800
- opacity: 0.5;
801
- }
802
-
803
- .empty-state-title {
804
- font-size: 1rem;
805
- font-weight: 600;
806
- color: var(--text-secondary);
807
- }
808
-
809
- .empty-state-desc {
810
- font-size: 0.875rem;
811
- max-width: 320px;
812
- line-height: 1.6;
813
- }
814
-
815
- /* ============================================================
816
- STATS GRID
817
- ============================================================ */
818
-
819
- .stats-grid {
820
- display: grid;
821
- grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
822
- gap: 1rem;
823
- margin-bottom: 1.5rem;
824
- }
825
-
826
- .stat-card {
827
- background: var(--bg-surface);
828
- border: 1px solid var(--border-subtle);
829
- border-radius: var(--radius-lg);
830
- padding: 1.25rem;
831
- transition: border-color var(--transition-base);
832
- }
833
-
834
- .stat-card:hover { border-color: var(--border-default); }
835
-
836
- .stat-value {
837
- font-size: 2rem;
838
- font-weight: 700;
839
- letter-spacing: -0.03em;
840
- color: var(--text-primary);
841
- line-height: 1;
842
- margin-bottom: 0.35rem;
843
- }
844
-
845
- .stat-label {
846
- font-size: 0.78rem;
847
- font-weight: 500;
848
- color: var(--text-muted);
849
- text-transform: uppercase;
850
- letter-spacing: 0.06em;
851
- }
852
-
853
- /* ============================================================
854
- CODE & MONO
855
- ============================================================ */
856
-
857
- .code-viewer {
858
- background: #0b0e14;
859
- border: 1px solid var(--border-subtle);
860
- border-radius: var(--radius-md);
861
- padding: 1rem 1.25rem;
862
- overflow: auto;
863
- max-height: 420px;
864
- font-family: var(--font-mono);
865
- font-size: 0.82rem;
866
- line-height: 1.7;
867
- white-space: pre-wrap;
868
- color: #c9d1d9;
869
- }
870
-
871
- .workflow-id {
872
- font-family: var(--font-mono);
873
- font-size: 0.78rem;
874
- color: var(--text-secondary);
875
- background: var(--bg-elevated);
876
- border: 1px solid var(--border-subtle);
877
- padding: 0.15rem 0.5rem;
878
- border-radius: var(--radius-sm);
879
- letter-spacing: 0.02em;
880
- }
881
-
882
- /* ============================================================
883
- TIMELINE
884
- ============================================================ */
885
-
886
- .timeline {
887
- list-style: none;
888
- padding: 0;
889
- margin: 0;
890
- position: relative;
891
- }
892
-
893
- .timeline::before {
894
- content: '';
895
- position: absolute;
896
- left: 0.75rem;
897
- top: 0;
898
- bottom: 0;
899
- width: 1px;
900
- background: var(--border-subtle);
901
- }
902
-
903
- .timeline li {
904
- display: flex;
905
- gap: 1rem;
906
- padding: 0.65rem 0;
907
- position: relative;
908
- }
909
-
910
- .timeline .icon {
911
- width: 1.5rem;
912
- height: 1.5rem;
913
- border-radius: 50%;
914
- background: var(--bg-elevated);
915
- border: 1px solid var(--border-default);
916
- display: flex;
917
- align-items: center;
918
- justify-content: center;
919
- font-size: 0.7rem;
920
- flex-shrink: 0;
921
- position: relative;
922
- z-index: 1;
923
- }
924
-
925
- .timeline .time {
926
- color: var(--text-muted);
927
- font-size: 0.72rem;
928
- font-family: var(--font-mono);
929
- white-space: nowrap;
930
- padding-top: 0.2rem;
931
- }
932
-
933
- /* ============================================================
934
- TASK GRAPH
935
- ============================================================ */
936
-
937
- .task-graph {
938
- display: flex;
939
- flex-wrap: wrap;
940
- gap: 0.75rem;
941
- }
942
-
943
- .task-node {
944
- border: 1px solid var(--border-default);
945
- border-radius: var(--radius-md);
946
- padding: 0.85rem 1rem;
947
- min-width: 150px;
948
- background: var(--bg-elevated);
949
- font-size: 0.82rem;
950
- transition: border-color var(--transition-fast);
951
- }
952
-
953
- .task-node:hover { border-color: var(--accent-primary); }
954
-
955
- /* ============================================================
956
- GRID HELPERS
957
- ============================================================ */
958
-
959
- .grid-2 {
960
- display: grid;
961
- grid-template-columns: 1fr 1fr;
962
- gap: 1rem;
963
- }
964
-
965
- .grid-3 {
966
- display: grid;
967
- grid-template-columns: 1fr 1fr 1fr;
968
- gap: 1rem;
969
- }
970
-
971
- /* ============================================================
972
- WORKFLOW PROMPT PREVIEW
973
- ============================================================ */
974
-
975
- .prompt-preview {
976
- font-size: 0.9rem;
977
- color: var(--text-secondary);
978
- line-height: 1.6;
979
- background: var(--bg-elevated);
980
- border-radius: var(--radius-md);
981
- padding: 1rem;
982
- border-left: 3px solid var(--accent-primary);
983
- margin-bottom: 1rem;
984
- }
985
-
986
- /* ============================================================
987
- RESPONSIVE
988
- ============================================================ */
989
-
990
- @media (max-width: 900px) {
991
- .app-shell {
992
- grid-template-columns: 1fr;
993
- }
994
-
995
- .sidebar {
996
- position: relative;
997
- height: auto;
998
- border-right: none;
999
- border-bottom: 1px solid var(--border-subtle);
1000
- }
1001
-
1002
- .sidebar-nav {
1003
- flex-direction: row;
1004
- flex-wrap: wrap;
1005
- padding: 0.5rem;
1006
- }
1007
-
1008
- .sidebar a,
1009
- .sidebar-nav-btn {
1010
- width: auto;
1011
- flex: 1;
1012
- min-width: 100px;
1013
- justify-content: center;
1014
- text-align: center;
1015
- font-size: 0.8rem;
1016
- }
1017
-
1018
- .nav-icon { display: none; }
1019
- .sidebar-footer { display: none; }
1020
-
1021
- .main-content {
1022
- padding: 1.25rem;
1023
- }
1024
-
1025
- .grid-2, .grid-3 {
1026
- grid-template-columns: 1fr;
1027
- }
1028
-
1029
- .stats-grid {
1030
- grid-template-columns: 1fr 1fr;
1031
- }
1032
- }
1033
-
1034
- @media (max-width: 480px) {
1035
- .stats-grid {
1036
- grid-template-columns: 1fr;
1037
- }
1038
- .auth-card {
1039
- padding: 1.5rem;
1040
- }
1041
- }
1042
-
1043
- /* ============================================================
1044
- LIVE AGENT GLOWING & WORKING ANIMATIONS
1045
- ============================================================ */
1046
-
1047
- @keyframes pulse-ring {
1048
- 0% {
1049
- transform: scale(0.95);
1050
- box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.8);
1051
- }
1052
- 70% {
1053
- transform: scale(1.1);
1054
- box-shadow: 0 0 0 12px rgba(99, 102, 241, 0);
1055
- }
1056
- 100% {
1057
- transform: scale(0.95);
1058
- box-shadow: 0 0 0 0 rgba(99, 102, 241, 0);
1059
- }
1060
- }
1061
-
1062
- @keyframes pulse-ring-green {
1063
- 0% {
1064
- transform: scale(0.95);
1065
- box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.8);
1066
- }
1067
- 70% {
1068
- transform: scale(1.1);
1069
- box-shadow: 0 0 0 12px rgba(16, 185, 129, 0);
1070
- }
1071
- 100% {
1072
- transform: scale(0.95);
1073
- box-shadow: 0 0 0 0 rgba(16, 185, 129, 0);
1074
- }
1075
- }
1076
-
1077
- @keyframes live-glow {
1078
- 0%, 100% {
1079
- box-shadow: 0 0 16px rgba(99, 102, 241, 0.4), 0 0 32px rgba(168, 85, 247, 0.2);
1080
- border-color: rgba(99, 102, 241, 0.7);
1081
- }
1082
- 50% {
1083
- box-shadow: 0 0 30px rgba(99, 102, 241, 0.7), 0 0 60px rgba(168, 85, 247, 0.45);
1084
- border-color: rgba(168, 85, 247, 1);
1085
- }
1086
- }
1087
-
1088
- @keyframes live-neon-sweep {
1089
- 0% {
1090
- background-position: 0% 50%;
1091
- }
1092
- 50% {
1093
- background-position: 100% 50%;
1094
- }
1095
- 100% {
1096
- background-position: 0% 50%;
1097
- }
1098
- }
1099
-
1100
- @keyframes shimmer-bar {
1101
- 0% {
1102
- background-position: -200% 0;
1103
- }
1104
- 100% {
1105
- background-position: 200% 0;
1106
- }
1107
- }
1108
-
1109
- @keyframes bounce-dot {
1110
- 0%, 80%, 100% {
1111
- transform: scale(0.4);
1112
- opacity: 0.3;
1113
- }
1114
- 40% {
1115
- transform: scale(1.1);
1116
- opacity: 1;
1117
- }
1118
- }
1119
-
1120
- .radar-dot {
1121
- width: 10px;
1122
- height: 10px;
1123
- background: #6366f1;
1124
- border-radius: 50%;
1125
- display: inline-block;
1126
- animation: pulse-ring 1.6s cubic-bezier(0.45, 0, 0.55, 1) infinite;
1127
- }
1128
-
1129
- .radar-dot.green {
1130
- background: #10b981;
1131
- animation: pulse-ring-green 1.6s cubic-bezier(0.45, 0, 0.55, 1) infinite;
1132
- }
1133
-
1134
- .agent-live-banner {
1135
- background: linear-gradient(135deg, rgba(99, 102, 241, 0.12) 0%, rgba(168, 85, 247, 0.12) 100%);
1136
- border: 1px solid rgba(99, 102, 241, 0.4);
1137
- border-radius: var(--radius-lg);
1138
- padding: 1.25rem 1.5rem;
1139
- margin-bottom: 1.5rem;
1140
- animation: live-glow 2.5s ease-in-out infinite;
1141
- display: flex;
1142
- flex-direction: column;
1143
- gap: 0.75rem;
1144
- }
1145
-
1146
- .agent-live-header {
1147
- display: flex;
1148
- align-items: center;
1149
- justify-content: space-between;
1150
- font-weight: 600;
1151
- color: var(--text-primary);
1152
- }
1153
-
1154
- .thinking-shimmer-progress {
1155
- height: 6px;
1156
- width: 100%;
1157
- background: linear-gradient(90deg, rgba(99, 102, 241, 0.2) 0%, #6366f1 30%, #ec4899 70%, rgba(168, 85, 247, 0.2) 100%);
1158
- background-size: 200% 100%;
1159
- animation: shimmer-bar 1.8s linear infinite;
1160
- border-radius: 999px;
1161
- }
1162
-
1163
- .thinking-dots span {
1164
- display: inline-block;
1165
- width: 6px;
1166
- height: 6px;
1167
- background: currentColor;
1168
- border-radius: 50%;
1169
- margin: 0 2px;
1170
- animation: bounce-dot 1.4s infinite ease-in-out both;
1171
- }
1172
- .thinking-dots span:nth-child(1) { animation-delay: -0.32s; }
1173
- .thinking-dots span:nth-child(2) { animation-delay: -0.16s; }
1174
-
1175
- .task-node.running {
1176
- border-color: #6366f1 !important;
1177
- animation: live-glow 2s ease-in-out infinite;
1178
- background: linear-gradient(145deg, var(--bg-surface), rgba(99, 102, 241, 0.1)) !important;
1179
- }
1180
-
1181
- .status.RUNNING {
1182
- background: rgba(99, 102, 241, 0.18) !important;
1183
- color: #6366f1 !important;
1184
- box-shadow: 0 0 12px rgba(99, 102, 241, 0.5);
1185
- font-weight: 700;
1186
- animation: live-glow 2s infinite;
1187
- }
1188
-
1189
- .live-thinking-pulse {
1190
- display: flex;
1191
- align-items: center;
1192
- gap: 0.75rem;
1193
- padding: 0.85rem 1.25rem;
1194
- background: linear-gradient(90deg, rgba(99, 102, 241, 0.08) 0%, rgba(168, 85, 247, 0.08) 100%);
1195
- border: 1px dashed rgba(99, 102, 241, 0.5);
1196
- border-radius: var(--radius-md);
1197
- margin-top: 1rem;
1198
- color: #6366f1;
1199
- font-weight: 500;
1200
- font-size: 0.9rem;
1201
- animation: live-glow 2.5s ease-in-out infinite;
1202
- }
1203
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/main.tsx DELETED
@@ -1,13 +0,0 @@
1
- import React from "react";
2
- import ReactDOM from "react-dom/client";
3
- import { BrowserRouter } from "react-router-dom";
4
- import App from "./App";
5
- import "./index.css";
6
-
7
- ReactDOM.createRoot(document.getElementById("root")!).render(
8
- <React.StrictMode>
9
- <BrowserRouter>
10
- <App />
11
- </BrowserRouter>
12
- </React.StrictMode>
13
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/pages/DashboardPage.tsx DELETED
@@ -1,64 +0,0 @@
1
- import { useState } from "react";
2
- import { useNavigate } from "react-router-dom";
3
- import { api } from "../api/client";
4
-
5
- export default function DashboardPage() {
6
- const [prompt, setPrompt] = useState("");
7
- const [apiKey, setApiKey] = useState("");
8
- const [error, setError] = useState("");
9
- const [loading, setLoading] = useState(false);
10
- const navigate = useNavigate();
11
-
12
- const handleSubmit = async (e: React.FormEvent) => {
13
- e.preventDefault();
14
- if (!prompt.trim()) return setError("Prompt cannot be empty");
15
- if (!apiKey.trim()) return setError("API Key is required");
16
-
17
- setLoading(true);
18
- setError("");
19
-
20
- try {
21
- const workflow = await api.createWorkflow({
22
- user_prompt: prompt.trim(),
23
- llm_provider: "gemini",
24
- llm_model: "gemini-1.5-pro",
25
- api_key: apiKey.trim(),
26
- });
27
- await api.startWorkflow(workflow.workflow_id, apiKey.trim());
28
- navigate(`/workflows/${workflow.workflow_id}`);
29
- } catch (err: any) {
30
- setError(err.message || "Failed to start workflow");
31
- setLoading(false);
32
- }
33
- };
34
-
35
- return (
36
- <div style={{ maxWidth: "800px", margin: "4rem auto", textAlign: "center" }}>
37
- <h1 style={{ fontSize: "2rem", marginBottom: "1rem", fontWeight: 600 }}>What would you like to build?</h1>
38
- <p style={{ color: "var(--text-secondary)", marginBottom: "3rem" }}>AutoForge AI will autonomously plan, write, and test your application.</p>
39
-
40
- {error && <div className="alert alert-error">{error}</div>}
41
-
42
- <form onSubmit={handleSubmit} style={{ display: "flex", flexDirection: "column", gap: "1rem" }}>
43
- <input
44
- type="password"
45
- placeholder="Enter your Gemini API Key..."
46
- value={apiKey}
47
- onChange={(e) => setApiKey(e.target.value)}
48
- style={{ padding: "1rem", fontSize: "1rem", borderRadius: "var(--radius-lg)", boxShadow: "var(--shadow-sm)" }}
49
- />
50
-
51
- <textarea
52
- placeholder="E.g. Create a simple Python FastAPI server that serves a React to-do app..."
53
- value={prompt}
54
- onChange={(e) => setPrompt(e.target.value)}
55
- style={{ minHeight: "150px", padding: "1rem", fontSize: "1.1rem", borderRadius: "var(--radius-lg)", boxShadow: "var(--shadow-md)" }}
56
- />
57
-
58
- <button type="submit" className="primary" disabled={loading} style={{ alignSelf: "flex-end", padding: "0.8rem 2rem", fontSize: "1.1rem" }}>
59
- {loading ? "Starting..." : "Generate Code"}
60
- </button>
61
- </form>
62
- </div>
63
- );
64
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/pages/SettingsPage.tsx DELETED
@@ -1,70 +0,0 @@
1
- import { useEffect, useState } from "react";
2
- import { api } from "../api/client";
3
- import type { ApiCredential, ProviderInfo } from "../types";
4
-
5
- export default function SettingsPage() {
6
- const [credentials, setCredentials] = useState<ApiCredential[]>([]);
7
- const [providers, setProviders] = useState<ProviderInfo[]>([]);
8
- const [provider, setProvider] = useState("openai");
9
- const [apiKey, setApiKey] = useState("");
10
- const [message, setMessage] = useState("");
11
-
12
- const load = () => api.listCredentials().then(setCredentials);
13
-
14
- useEffect(() => {
15
- load();
16
- api.listProviders().then((data) => {
17
- setProviders(data.providers);
18
- if (data.providers.length) setProvider(data.providers[0].id);
19
- });
20
- }, []);
21
-
22
- const save = async (e: React.FormEvent) => {
23
- e.preventDefault();
24
- await api.saveCredential(provider, apiKey);
25
- setApiKey("");
26
- setMessage("Credential saved");
27
- load();
28
- };
29
-
30
- return (
31
- <div>
32
- <h2>API Key Settings</h2>
33
- <div className="card">
34
- <form onSubmit={save}>
35
- <label>Provider</label>
36
- <select value={provider} onChange={(e) => setProvider(e.target.value)}>
37
- {providers.map((p) => (
38
- <option key={p.id} value={p.id}>{p.name}</option>
39
- ))}
40
- </select>
41
- <label>API Key</label>
42
- <input type="password" value={apiKey} onChange={(e) => setApiKey(e.target.value)} required />
43
- <button className="primary" type="submit">Save Credential</button>
44
- </form>
45
- {message && <p>{message}</p>}
46
- </div>
47
- <div className="card">
48
- <h3>Saved Credentials</h3>
49
- <table className="table">
50
- <thead>
51
- <tr><th>Provider</th><th>Hint</th><th></th></tr>
52
- </thead>
53
- <tbody>
54
- {credentials.map((c) => (
55
- <tr key={c.id}>
56
- <td>{c.provider}</td>
57
- <td>{c.api_key_hint}</td>
58
- <td>
59
- <button className="secondary" onClick={() => api.deleteCredential(c.id).then(load)}>
60
- Delete
61
- </button>
62
- </td>
63
- </tr>
64
- ))}
65
- </tbody>
66
- </table>
67
- </div>
68
- </div>
69
- );
70
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/pages/WorkflowPage.tsx DELETED
@@ -1,125 +0,0 @@
1
- import { useEffect, useState } from "react";
2
- import { useParams } from "react-router-dom";
3
- import { api } from "../api/client";
4
- import WorkflowTimeline from "../components/WorkflowTimeline";
5
- import TaskGraph from "../components/TaskGraph";
6
- import CodeViewer from "../components/CodeViewer";
7
- import AttemptsPanel from "../components/AttemptsPanel";
8
- import ExecutionLogs from "../components/ExecutionLogs";
9
- import { useWorkflowLive } from "../hooks/useWorkflowLive";
10
- import type { Attempt, Task, Workflow } from "../types";
11
-
12
- type Tab = "timeline" | "tasks" | "code" | "tests" | "analysis" | "logs" | "attempts" | "result";
13
-
14
- export default function WorkflowPage() {
15
- const { id = "" } = useParams();
16
- const [workflow, setWorkflow] = useState<Workflow | null>(null);
17
- const [tasks, setTasks] = useState<Task[]>([]);
18
- const [attempts, setAttempts] = useState<Attempt[]>([]);
19
- const [tab, setTab] = useState<Tab>("timeline");
20
- const [error, setError] = useState("");
21
-
22
- const isLive = workflow
23
- ? !["SUCCESS", "FAILED", "CANCELLED"].includes(workflow.status)
24
- : false;
25
- const { events } = useWorkflowLive(id, isLive);
26
-
27
- const refresh = async () => {
28
- try {
29
- const [wf, taskData, attemptData] = await Promise.all([
30
- api.getWorkflow(id),
31
- api.getTasks(id),
32
- api.getAttempts(id),
33
- ]);
34
- setWorkflow(wf);
35
- setTasks(taskData.tasks);
36
- setAttempts(attemptData.attempts);
37
- } catch (err) {
38
- setError(err instanceof Error ? err.message : "Failed to load workflow");
39
- }
40
- };
41
-
42
- useEffect(() => {
43
- refresh();
44
- const interval = setInterval(refresh, 2000);
45
- return () => clearInterval(interval);
46
- }, [id]);
47
-
48
- const codeTask = tasks.find((t) => t.task_type === "code_generation");
49
- const testTask = tasks.find((t) => t.task_type === "test_generation");
50
- const analysisTask = tasks.find((t) => t.task_type === "static_analysis");
51
-
52
- const codeFiles = (codeTask?.output as { files?: Record<string, { content: string }> })?.files
53
- || attempts.find((a) => a.generated_code)?.generated_code?.files as Record<string, { content: string }>;
54
-
55
- const testFiles = (testTask?.output as { files?: Record<string, { content: string }> })?.files
56
- || attempts.find((a) => a.generated_tests)?.generated_tests?.files as Record<string, { content: string }>;
57
-
58
- const analysisResult = analysisTask?.output
59
- || attempts.find((a) => a.static_analysis_result)?.static_analysis_result;
60
-
61
- if (!workflow) return <p>Loading workflow…</p>;
62
-
63
- return (
64
- <div>
65
- <h2>Workflow {workflow.workflow_id}</h2>
66
- {error && <p className="error">{error}</p>}
67
- {isLive && (
68
- <div className="agent-live-banner">
69
- <div className="agent-live-header">
70
- <div style={{ display: "flex", alignItems: "center", gap: "0.75rem" }}>
71
- <span className="radar-dot green"></span>
72
- <span style={{ fontSize: "1.05rem", fontWeight: 600 }}>Agent is Actively Working</span>
73
- </div>
74
- <span style={{ fontSize: "0.85rem", color: "#6366f1", fontWeight: 600, display: "flex", alignItems: "center", gap: "0.25rem" }}>
75
- AUTONOMOUS LOOP <span className="thinking-dots"><span></span><span></span><span></span></span>
76
- </span>
77
- </div>
78
- <p style={{ margin: 0, color: "var(--text-secondary)", fontSize: "0.9rem" }}>
79
- The AI agent is planning architecture, generating code & tests, and orchestrating verification tasks in the background.
80
- </p>
81
- <div className="thinking-shimmer-progress"></div>
82
- </div>
83
- )}
84
-
85
- <div className="card">
86
- <p style={{ fontSize: "1.1rem", marginBottom: "0.75rem", fontWeight: 500 }}>{workflow.user_prompt}</p>
87
- <p style={{ display: "flex", alignItems: "center", gap: "0.75rem", margin: 0 }}>
88
- <span className={`status ${workflow.status}`}>{workflow.status}</span>
89
- <span style={{ color: "var(--text-muted)", fontSize: "0.9rem" }}>{workflow.llm_provider} / {workflow.llm_model}</span>
90
- </p>
91
- </div>
92
-
93
- <div className="tabs">
94
- {(["timeline", "tasks", "code", "tests", "analysis", "logs", "attempts", "result"] as Tab[]).map((t) => (
95
- <button key={t} className={tab === t ? "active" : ""} onClick={() => setTab(t)}>
96
- {t.charAt(0).toUpperCase() + t.slice(1)}
97
- </button>
98
- ))}
99
- </div>
100
-
101
- <div className="card">
102
- {tab === "timeline" && <WorkflowTimeline events={events} />}
103
- {tab === "tasks" && <TaskGraph plannerOutput={workflow.planner_output} tasks={tasks} />}
104
- {tab === "code" && <CodeViewer files={codeFiles} />}
105
- {tab === "tests" && <CodeViewer files={testFiles} />}
106
- {tab === "analysis" && (
107
- <pre className="code-viewer">{JSON.stringify(analysisResult, null, 2)}</pre>
108
- )}
109
- {tab === "logs" && <ExecutionLogs attempts={attempts} />}
110
- {tab === "attempts" && <AttemptsPanel attempts={attempts} />}
111
- {tab === "result" && (
112
- <div>
113
- <p><strong>Status:</strong> {workflow.status}</p>
114
- <p><strong>Completed:</strong> {workflow.completed_at ? new Date(workflow.completed_at).toLocaleString() : "—"}</p>
115
- <p><strong>Repair attempts:</strong> {attempts.length}</p>
116
- <h3>Final Code</h3>
117
- <CodeViewer files={codeFiles} />
118
- <h3>Final Tests</h3>
119
- <CodeViewer files={testFiles} />
120
- </div>
121
- )}
122
- </div>
123
- </div>
124
- );
125
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/types.ts DELETED
@@ -1,65 +0,0 @@
1
- export interface User {
2
- id: number;
3
- email: string;
4
- username: string;
5
- created_at: string;
6
- }
7
-
8
- export interface Workflow {
9
- workflow_id: string;
10
- user_prompt: string;
11
- status: string;
12
- llm_provider: string | null;
13
- llm_model: string | null;
14
- planner_output: Record<string, unknown> | null;
15
- created_at: string;
16
- completed_at: string | null;
17
- }
18
-
19
- export interface Task {
20
- task_key: string;
21
- task_type: string;
22
- status: string;
23
- depends_on: string[] | null;
24
- output: Record<string, unknown> | null;
25
- started_at: string | null;
26
- completed_at: string | null;
27
- }
28
-
29
- export interface WorkflowEvent {
30
- id: number;
31
- event_type: string;
32
- message: string;
33
- task_id: number | null;
34
- metadata: Record<string, unknown> | null;
35
- timestamp: string;
36
- }
37
-
38
- export interface Attempt {
39
- id: number;
40
- task_id: number | null;
41
- attempt_number: number;
42
- generated_code: Record<string, unknown> | null;
43
- generated_tests: Record<string, unknown> | null;
44
- static_analysis_result: Record<string, unknown> | null;
45
- stdout: string | null;
46
- stderr: string | null;
47
- exit_code: number | null;
48
- result: string | null;
49
- error: Record<string, unknown> | null;
50
- created_at: string;
51
- }
52
-
53
- export interface ProviderInfo {
54
- id: string;
55
- name: string;
56
- models: string[];
57
- }
58
-
59
- export interface ApiCredential {
60
- id: number;
61
- provider: string;
62
- api_key_hint: string;
63
- created_at: string;
64
- updated_at: string;
65
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/vite-env.d.ts DELETED
@@ -1 +0,0 @@
1
- /// <reference types="vite/client" />
 
 
frontend/tsconfig.json DELETED
@@ -1,21 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "useDefineForClassFields": true,
5
- "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
- "module": "ESNext",
7
- "skipLibCheck": true,
8
- "moduleResolution": "bundler",
9
- "allowImportingTsExtensions": true,
10
- "isolatedModules": true,
11
- "moduleDetection": "force",
12
- "noEmit": true,
13
- "jsx": "react-jsx",
14
- "strict": true,
15
- "noUnusedLocals": true,
16
- "noUnusedParameters": true,
17
- "noFallthroughCasesInSwitch": true,
18
- "noUncheckedSideEffectImports": true
19
- },
20
- "include": ["src"]
21
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/tsconfig.tsbuildinfo DELETED
@@ -1 +0,0 @@
1
- {"root":["./src/app.tsx","./src/main.tsx","./src/types.ts","./src/vite-env.d.ts","./src/api/client.ts","./src/components/attemptspanel.tsx","./src/components/codeviewer.tsx","./src/components/executionlogs.tsx","./src/components/layout.tsx","./src/components/taskgraph.tsx","./src/components/workflowtimeline.tsx","./src/context/authcontext.tsx","./src/hooks/useworkflowlive.ts","./src/pages/dashboardpage.tsx","./src/pages/loginpage.tsx","./src/pages/newworkflowpage.tsx","./src/pages/settingspage.tsx","./src/pages/signuppage.tsx","./src/pages/workflowpage.tsx"],"version":"5.9.3"}
 
 
frontend/vite.config.ts DELETED
@@ -1,15 +0,0 @@
1
- import { defineConfig } from "vite";
2
- import react from "@vitejs/plugin-react";
3
-
4
- export default defineConfig({
5
- plugins: [react()],
6
- server: {
7
- port: 5173,
8
- proxy: {
9
- "/api": {
10
- target: "http://localhost:8000",
11
- changeOrigin: true,
12
- },
13
- },
14
- },
15
- });