Spaces:
Sleeping
Sleeping
Delete frontend
Browse files- frontend/index.html +0 -16
- frontend/package-lock.json +0 -1792
- frontend/package.json +0 -23
- frontend/src/App.tsx +0 -35
- frontend/src/api/client.ts +0 -107
- frontend/src/components/AttemptsPanel.tsx +0 -30
- frontend/src/components/CodeViewer.tsx +0 -20
- frontend/src/components/ExecutionLogs.tsx +0 -16
- frontend/src/components/Layout.tsx +0 -34
- frontend/src/components/TaskGraph.tsx +0 -51
- frontend/src/components/WorkflowTimeline.tsx +0 -127
- frontend/src/context/AuthContext.tsx +0 -51
- frontend/src/hooks/useWorkflowLive.ts +0 -60
- frontend/src/index.css +0 -1203
- frontend/src/main.tsx +0 -13
- frontend/src/pages/DashboardPage.tsx +0 -64
- frontend/src/pages/SettingsPage.tsx +0 -70
- frontend/src/pages/WorkflowPage.tsx +0 -125
- frontend/src/types.ts +0 -65
- frontend/src/vite-env.d.ts +0 -1
- frontend/tsconfig.json +0 -21
- frontend/tsconfig.tsbuildinfo +0 -1
- frontend/vite.config.ts +0 -15
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 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|