diff --git a/cli.js b/cli.js index 676dc856..531b8dd6 100644 --- a/cli.js +++ b/cli.js @@ -10058,9 +10058,10 @@ function watchPathsForRestart(targets, onChange) { } // #endregion watchPathsForRestart -function writeJsonResponse(res, statusCode, payload) { +function writeJsonResponse(res, statusCode, payload, headers = {}) { const body = JSON.stringify(payload, null, 2); res.writeHead(statusCode, { + ...headers, 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': Buffer.byteLength(body, 'utf-8') }); @@ -10620,7 +10621,7 @@ function createWebServer({ htmlPath, assetsDir, webDir, host, port, openBrowser const securityHeaders = { 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'DENY', - 'Content-Security-Policy': "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self' ws: wss:" + 'Content-Security-Policy': "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self' ws: wss:" }; const origWriteHead = res.writeHead.bind(res); res.writeHead = function (statusCode, headers) { @@ -10649,34 +10650,15 @@ function createWebServer({ htmlPath, assetsDir, webDir, host, port, openBrowser || requestPath.startsWith('/download/') ) { const remoteAddr = req && req.socket ? req.socket.remoteAddress : ''; - const isLoopback = !remoteAddr - || remoteAddr === '127.0.0.1' - || remoteAddr === '::1' - || remoteAddr === '::ffff:127.0.0.1'; + const isLoopback = !remoteAddr || isLoopbackRemoteAddress(remoteAddr); if (!isLoopback) { const rateLimitKey = (remoteAddr || 'unknown') + ':' + requestPath; if (!checkRateLimit(rateLimitKey)) { - res.writeHead(429, { 'Content-Type': 'application/json; charset=utf-8', 'Retry-After': '60' }); - res.end(JSON.stringify({ error: 'Rate limit exceeded' })); + writeJsonResponse(res, 429, { error: 'Rate limit exceeded' }, { 'Retry-After': '60' }); return; } - const expected = typeof process.env.CODEXMATE_HTTP_TOKEN === 'string' - ? process.env.CODEXMATE_HTTP_TOKEN.trim() - : ''; - if (!expected) { - sendJson(403, { - error: 'Remote access is disabled (set CODEXMATE_HTTP_TOKEN or use --host 127.0.0.1)' - }); - return; - } - const headers = req && req.headers && typeof req.headers === 'object' ? req.headers : {}; - const rawAuth = typeof headers.authorization === 'string' ? headers.authorization.trim() : ''; - const match = rawAuth ? rawAuth.match(/^bearer\s+(.+)$/i) : null; - const actual = match && match[1] - ? match[1].trim() - : (rawAuth ? rawAuth : (typeof headers['x-codexmate-token'] === 'string' ? String(headers['x-codexmate-token']).trim() : '')); - if (!actual || !safeTimingEqual(actual, expected)) { - sendJson(401, { error: 'Unauthorized' }); + const auth = assertRequestAuthorized(req, res); + if (!auth.ok) { return; } } @@ -11408,15 +11390,18 @@ function createWebServer({ htmlPath, assetsDir, webDir, host, port, openBrowser res.end(errorBody, 'utf-8'); } }); - } else if (requestPath === '/web-ui') { - try { - const html = readBundledWebUiHtml(htmlPath); - res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); - res.end(html); - } catch (error) { - writeWebUiAssetError(res, requestPath, error); - } + } else if (requestPath === '/web-ui/index.html') { + const rawUrl = typeof req.url === 'string' ? req.url : ''; + const queryIndex = rawUrl.indexOf('?'); + const query = queryIndex >= 0 ? rawUrl.slice(queryIndex) : ''; + res.writeHead(302, { + 'Location': `/${query}`, + 'Content-Type': 'text/plain; charset=utf-8', + 'Cache-Control': 'no-store, max-age=0' + }); + res.end('Found'); } else if (requestPath.startsWith('/web-ui/')) { + // Skip the /web-ui/ directory itself, which is handled above const normalized = path.normalize(requestPath).replace(/^([\\.\\/])+/, ''); const filePath = path.join(__dirname, normalized); if (!isPathInside(filePath, webDir)) { @@ -11425,11 +11410,22 @@ function createWebServer({ htmlPath, assetsDir, webDir, host, port, openBrowser return; } const relativePath = path.relative(webDir, filePath).replace(/\\/g, '/'); + + // Empty relativePath means direct /web-ui/ access - return 404 + if (relativePath === '' || relativePath === 'index.html') { + res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' }); + res.end('Not Found'); + return; + } + const dynamicAsset = PUBLIC_WEB_UI_DYNAMIC_ASSETS.get(relativePath); if (dynamicAsset) { try { const assetBody = dynamicAsset.reader(filePath); - res.writeHead(200, { 'Content-Type': dynamicAsset.mime }); + res.writeHead(200, { + 'Content-Type': dynamicAsset.mime, + 'Cache-Control': 'no-store, max-age=0' + }); res.end(assetBody, 'utf-8'); } catch (error) { writeWebUiAssetError(res, requestPath, error); @@ -11456,7 +11452,10 @@ function createWebServer({ htmlPath, assetsDir, webDir, host, port, openBrowser : ext === '.json' ? 'application/json; charset=utf-8' : 'application/octet-stream'; - res.writeHead(200, { 'Content-Type': mime }); + res.writeHead(200, { + 'Content-Type': mime, + 'Cache-Control': 'no-store, max-age=0' + }); fs.createReadStream(filePath).pipe(res); } else if (requestPath.startsWith('/download/')) { const fileName = requestPath.slice('/download/'.length); @@ -11517,15 +11516,27 @@ function createWebServer({ htmlPath, assetsDir, webDir, host, port, openBrowser : ext === '.json' ? 'application/json; charset=utf-8' : 'application/octet-stream'; - res.writeHead(200, { 'Content-Type': mime }); + res.writeHead(200, { + 'Content-Type': mime, + 'Cache-Control': 'no-store, max-age=0' + }); fs.createReadStream(filePath).pipe(res); } else { - try { - const html = readBundledWebUiHtml(htmlPath); - res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); - res.end(html); - } catch (error) { - writeWebUiAssetError(res, requestPath, error); + // Only serve HTML for root path; /web-ui returns 404. + if (requestPath === '/') { + try { + const html = readBundledWebUiHtml(htmlPath); + res.writeHead(200, { + 'Content-Type': 'text/html; charset=utf-8', + 'Cache-Control': 'no-store, max-age=0' + }); + res.end(html); + } catch (error) { + writeWebUiAssetError(res, requestPath, error); + } + } else { + res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' }); + res.end('Not Found'); } } }); diff --git a/package-lock.json b/package-lock.json index 59dbe430..5ace61d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,16 @@ { "name": "codexmate", - "version": "0.1.0", + "version": "0.0.35", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "codexmate", - "version": "0.1.0", + "version": "0.0.35", "license": "Apache-2.0", "dependencies": { "@iarna/toml": "^2.2.5", + "@vue/compiler-dom": "^3.5.30", "json5": "^2.2.3", "yauzl": "^3.2.1", "zip-lib": "^1.2.1" @@ -286,7 +287,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -296,7 +296,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -306,7 +305,6 @@ "version": "7.29.2", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -322,7 +320,6 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1332,7 +1329,6 @@ "version": "3.5.30", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", @@ -1346,7 +1342,6 @@ "version": "3.5.30", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", - "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-core": "3.5.30", @@ -1470,7 +1465,6 @@ "version": "3.5.30", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", - "dev": true, "license": "MIT" }, "node_modules/@vueuse/core": { @@ -1726,7 +1720,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -1778,7 +1771,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, "license": "MIT" }, "node_modules/focus-trap": { @@ -2244,7 +2236,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" diff --git a/package.json b/package.json index 086cb09f..d810a16c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codexmate", - "version": "0.1.0", + "version": "0.0.35", "description": "Codex/Claude Code/OpenClaw 配置、会话与任务编排 CLI + Web 工具", "main": "cli.js", "bin": { @@ -46,6 +46,7 @@ }, "dependencies": { "@iarna/toml": "^2.2.5", + "@vue/compiler-dom": "^3.5.30", "json5": "^2.2.3", "yauzl": "^3.2.1", "zip-lib": "^1.2.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..997e9da7 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1686 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@iarna/toml': + specifier: ^2.2.5 + version: 2.2.5 + json5: + specifier: ^2.2.3 + version: 2.2.3 + yauzl: + specifier: ^3.2.1 + version: 3.3.0 + zip-lib: + specifier: ^1.2.1 + version: 1.3.2 + devDependencies: + vitepress: + specifier: ^1.6.4 + version: 1.6.4(@algolia/client-search@5.52.1)(postcss@8.5.14)(search-insights@2.17.3) + +packages: + + '@algolia/abtesting@1.18.1': + resolution: {integrity: sha512-aehCadlWOGvrT91KUIZpC0MbB8KBW9yUuvTJFd2xesR7le/IsT4nJUnjCCZ4ZqZCeTcPHPV5mo//fZ5oxcSVYw==} + engines: {node: '>= 14.0.0'} + + '@algolia/autocomplete-core@1.17.7': + resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7': + resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.17.7': + resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.17.7': + resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.52.1': + resolution: {integrity: sha512-HmXOGBOAOJPounpBzBpuY0zDYeiCpxgHnQmuA7JO6ScukcBdGp3/XM9zJk5pJx/xNGD68mbPGXWpDxGtl6BwDQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.52.1': + resolution: {integrity: sha512-5oo4+I8iixie9vXhCyNFCzeIr8pqA3FQ//VsLHTDvZAV4ttYOPGvYHGQq5NSalrLx5Jc3dRro/5uDOlnUMcBJg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.52.1': + resolution: {integrity: sha512-qCDoZfx5MpX7XQzvQ3bC4tSEMkQWQMaF/ABtLuoze03Y/flR563CCSws02qIJ23oX7lxl92LsilZjINVyTdtLw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.52.1': + resolution: {integrity: sha512-hnGs0/lsFJ2PWDxNBz7pxreXo/Xz7gxYRcfePBUjsH26ad0kU/sgnVZd9LwWBpsQv65z2jlb5dkyaB9WE9M9FQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.52.1': + resolution: {integrity: sha512-2VxxNc/uBysyKvGeBdSM5n9eIDKH8kWD7wd9/yqbJAiVwU4Yv6tU1LSJusHKrXV/aCu1KW7t9Gug9QyeEmtn/Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.52.1': + resolution: {integrity: sha512-O6mPtsw3xEfNOe6gWFpYLeAZAIljNa4Hgna3bq15PwyN7nbjTY0wXJFRbzs/0YVf75Br+SbOQUmjKxXYjDiSiQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.52.1': + resolution: {integrity: sha512-gA8oJOV1LnQQkDf91iebNnFInHuW0gRPEgLSOQ7EfipCEjYTHm5swm1DlH9H5RaRw4RrHuzHBegnlzc0MAstcg==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.52.1': + resolution: {integrity: sha512-U9zZfc5xIu9wRxZkt+HceJUAD4VKHKbAyLSloJdEyMRmphXeibfrY9cxqIXBcmPeZzGhn3Imb35Dq8l19PkJhw==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.52.1': + resolution: {integrity: sha512-a3SGNceHmkQfq77iG8Ka+w1pvwfZa/0lzEIgse30fL0kD+yKnd/dg0dQvSfFPAEt2f21DMcGkDSSeJlO3KdQjQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.52.1': + resolution: {integrity: sha512-z98QEguCFDpxb4S/PyrUK1igqF8tPsdbqOUUO6ON91vJ58w+Gwa6ncrI0oNXSFcrkxA5EqPKPQ2A1PBCn08TYQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.52.1': + resolution: {integrity: sha512-CI7+/0I11QeZM59Uc8whd2or0kqzFVjpaPn9Qpwll/krHcBAxk24WkAQ6WX+IwDVMfpont4YGbKwAmCre3vE8Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.52.1': + resolution: {integrity: sha512-S6bDuw9byfOvm3T71cgdoZgrgnZq6hpdMLkx52Louh57nUAmvGQESz2aojOynQHjbTiV55smvAFbgn0qT4tJrg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.52.1': + resolution: {integrity: sha512-tqZXM+54rWo4mk5jL5Z/flE11nPmNEdXwFBM5py9DkOmbjeCNemfVd45FyM97XdzfZ0dl9uOJC6PYn1FpkeyQg==} + engines: {node: '>= 14.0.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@docsearch/css@3.8.2': + resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} + + '@docsearch/js@3.8.2': + resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} + + '@docsearch/react@3.8.2': + resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@iarna/toml@2.2.5': + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + + '@iconify-json/simple-icons@1.2.81': + resolution: {integrity: sha512-Utjw4sPtoVdbpAQAkC4O0cYpt4ehQZYr6aFHhmvdeW8mQwkINyAe0ogTPqNptSSKogZ2lfgXM8zpuhO961Wnng==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@rollup/rollup-android-arm-eabi@4.60.3': + resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.3': + resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.3': + resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.3': + resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.3': + resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.3': + resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.60.3': + resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.60.3': + resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.60.3': + resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.60.3': + resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.60.3': + resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.60.3': + resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.60.3': + resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.60.3': + resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.60.3': + resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.60.3': + resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.60.3': + resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.60.3': + resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.60.3': + resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.3': + resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.3': + resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.3': + resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.3': + resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.3': + resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==} + cpu: [x64] + os: [win32] + + '@shikijs/core@2.5.0': + resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} + + '@shikijs/engine-javascript@2.5.0': + resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} + + '@shikijs/engine-oniguruma@2.5.0': + resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} + + '@shikijs/langs@2.5.0': + resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} + + '@shikijs/themes@2.5.0': + resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} + + '@shikijs/transformers@2.5.0': + resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} + + '@shikijs/types@2.5.0': + resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.34': + resolution: {integrity: sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==} + + '@vue/compiler-dom@3.5.34': + resolution: {integrity: sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==} + + '@vue/compiler-sfc@3.5.34': + resolution: {integrity: sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==} + + '@vue/compiler-ssr@3.5.34': + resolution: {integrity: sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==} + + '@vue/devtools-api@7.7.9': + resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + + '@vue/devtools-kit@7.7.9': + resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + + '@vue/devtools-shared@7.7.9': + resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + + '@vue/reactivity@3.5.34': + resolution: {integrity: sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==} + + '@vue/runtime-core@3.5.34': + resolution: {integrity: sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==} + + '@vue/runtime-dom@3.5.34': + resolution: {integrity: sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==} + + '@vue/server-renderer@3.5.34': + resolution: {integrity: sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==} + peerDependencies: + vue: 3.5.34 + + '@vue/shared@3.5.34': + resolution: {integrity: sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==} + + '@vueuse/core@12.8.2': + resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + + '@vueuse/integrations@12.8.2': + resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@12.8.2': + resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + + '@vueuse/shared@12.8.2': + resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + + algoliasearch@5.52.1: + resolution: {integrity: sha512-fHA8+kXTbjagw3jkLiaS7KKrH8qe2DyOsiUhGlN4cdT77PEsfqXZl7ewDk1hsg+pJnPlnE50XtLxjR91iJOpmg==} + engines: {node: '>= 14.0.0'} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + focus-trap@7.8.0: + resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + oniguruma-to-es@3.1.1: + resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.29.1: + resolution: {integrity: sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.60.3: + resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + + shiki@2.5.0: + resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitepress@1.6.4: + resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + + vue@3.5.34: + resolution: {integrity: sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + yauzl@3.3.0: + resolution: {integrity: sha512-PtGEvEP30p7sbIBJKUBjUnqgTVOyMURc4dLo9iNyAJnNIEz9pm88cCXF21w94Kg3k6RXkeZh5DHOGS0qEONvNQ==} + engines: {node: '>=12'} + + yazl@3.3.1: + resolution: {integrity: sha512-BbETDVWG+VcMUle37k5Fqp//7SDOK2/1+T7X8TD96M3D9G8jK5VLUdQVdVjGi8im7FGkazX7kk5hkU8X4L5Bng==} + + zip-lib@1.3.2: + resolution: {integrity: sha512-y5i/N4exvEzl45gavh4IwBuspSc95R2Ju9zLTBdNWv3nttBqi9zKuz9q3Tz+tl6NOkTI0zwTBiAqv5WakQVOfQ==} + engines: {node: '>=20'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@algolia/abtesting@1.18.1': + dependencies: + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 + + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1) + '@algolia/client-search': 5.52.1 + algoliasearch: 5.52.1 + + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)': + dependencies: + '@algolia/client-search': 5.52.1 + algoliasearch: 5.52.1 + + '@algolia/client-abtesting@5.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 + + '@algolia/client-analytics@5.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 + + '@algolia/client-common@5.52.1': {} + + '@algolia/client-insights@5.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 + + '@algolia/client-personalization@5.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 + + '@algolia/client-query-suggestions@5.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 + + '@algolia/client-search@5.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 + + '@algolia/ingestion@1.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 + + '@algolia/monitoring@1.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 + + '@algolia/recommend@5.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 + + '@algolia/requester-browser-xhr@5.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + + '@algolia/requester-fetch@5.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + + '@algolia/requester-node-http@5.52.1': + dependencies: + '@algolia/client-common': 5.52.1 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@docsearch/css@3.8.2': {} + + '@docsearch/js@3.8.2(@algolia/client-search@5.52.1)(search-insights@2.17.3)': + dependencies: + '@docsearch/react': 3.8.2(@algolia/client-search@5.52.1)(search-insights@2.17.3) + preact: 10.29.1 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + + '@docsearch/react@3.8.2(@algolia/client-search@5.52.1)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.52.1)(algoliasearch@5.52.1) + '@docsearch/css': 3.8.2 + algoliasearch: 5.52.1 + optionalDependencies: + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@iarna/toml@2.2.5': {} + + '@iconify-json/simple-icons@1.2.81': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@rollup/rollup-android-arm-eabi@4.60.3': + optional: true + + '@rollup/rollup-android-arm64@4.60.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.3': + optional: true + + '@rollup/rollup-darwin-x64@4.60.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.3': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.3': + optional: true + + '@shikijs/core@2.5.0': + dependencies: + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 3.1.1 + + '@shikijs/engine-oniguruma@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + + '@shikijs/themes@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + + '@shikijs/transformers@2.5.0': + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 + + '@shikijs/types@2.5.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.21': {} + + '@ungap/structured-clone@1.3.1': {} + + '@vitejs/plugin-vue@5.2.4(vite@5.4.21)(vue@3.5.34)': + dependencies: + vite: 5.4.21 + vue: 3.5.34 + + '@vue/compiler-core@3.5.34': + dependencies: + '@babel/parser': 7.29.3 + '@vue/shared': 3.5.34 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.34': + dependencies: + '@vue/compiler-core': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/compiler-sfc@3.5.34': + dependencies: + '@babel/parser': 7.29.3 + '@vue/compiler-core': 3.5.34 + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-ssr': 3.5.34 + '@vue/shared': 3.5.34 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.14 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.34': + dependencies: + '@vue/compiler-dom': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/devtools-api@7.7.9': + dependencies: + '@vue/devtools-kit': 7.7.9 + + '@vue/devtools-kit@7.7.9': + dependencies: + '@vue/devtools-shared': 7.7.9 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.9': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.34': + dependencies: + '@vue/shared': 3.5.34 + + '@vue/runtime-core@3.5.34': + dependencies: + '@vue/reactivity': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/runtime-dom@3.5.34': + dependencies: + '@vue/reactivity': 3.5.34 + '@vue/runtime-core': 3.5.34 + '@vue/shared': 3.5.34 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.34(vue@3.5.34)': + dependencies: + '@vue/compiler-ssr': 3.5.34 + '@vue/shared': 3.5.34 + vue: 3.5.34 + + '@vue/shared@3.5.34': {} + + '@vueuse/core@12.8.2': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 12.8.2 + '@vueuse/shared': 12.8.2 + vue: 3.5.34 + transitivePeerDependencies: + - typescript + + '@vueuse/integrations@12.8.2(focus-trap@7.8.0)': + dependencies: + '@vueuse/core': 12.8.2 + '@vueuse/shared': 12.8.2 + vue: 3.5.34 + optionalDependencies: + focus-trap: 7.8.0 + transitivePeerDependencies: + - typescript + + '@vueuse/metadata@12.8.2': {} + + '@vueuse/shared@12.8.2': + dependencies: + vue: 3.5.34 + transitivePeerDependencies: + - typescript + + algoliasearch@5.52.1: + dependencies: + '@algolia/abtesting': 1.18.1 + '@algolia/client-abtesting': 5.52.1 + '@algolia/client-analytics': 5.52.1 + '@algolia/client-common': 5.52.1 + '@algolia/client-insights': 5.52.1 + '@algolia/client-personalization': 5.52.1 + '@algolia/client-query-suggestions': 5.52.1 + '@algolia/client-search': 5.52.1 + '@algolia/ingestion': 1.52.1 + '@algolia/monitoring': 1.52.1 + '@algolia/recommend': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 + + birpc@2.9.0: {} + + buffer-crc32@0.2.13: {} + + buffer-crc32@1.0.0: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + comma-separated-tokens@2.0.3: {} + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + csstype@3.2.3: {} + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + emoji-regex-xs@1.0.0: {} + + entities@7.0.1: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + estree-walker@2.0.2: {} + + focus-trap@7.8.0: + dependencies: + tabbable: 6.4.0 + + fsevents@2.3.3: + optional: true + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hookable@5.5.3: {} + + html-void-elements@3.0.0: {} + + is-what@5.5.0: {} + + json5@2.2.3: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mark.js@8.11.1: {} + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + minisearch@7.2.0: {} + + mitt@3.0.1: {} + + nanoid@3.3.12: {} + + oniguruma-to-es@3.1.1: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 6.1.0 + regex-recursion: 6.0.2 + + pend@1.2.0: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + postcss@8.5.14: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact@10.29.1: {} + + property-information@7.1.0: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rfdc@1.4.1: {} + + rollup@4.60.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.3 + '@rollup/rollup-android-arm64': 4.60.3 + '@rollup/rollup-darwin-arm64': 4.60.3 + '@rollup/rollup-darwin-x64': 4.60.3 + '@rollup/rollup-freebsd-arm64': 4.60.3 + '@rollup/rollup-freebsd-x64': 4.60.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.3 + '@rollup/rollup-linux-arm-musleabihf': 4.60.3 + '@rollup/rollup-linux-arm64-gnu': 4.60.3 + '@rollup/rollup-linux-arm64-musl': 4.60.3 + '@rollup/rollup-linux-loong64-gnu': 4.60.3 + '@rollup/rollup-linux-loong64-musl': 4.60.3 + '@rollup/rollup-linux-ppc64-gnu': 4.60.3 + '@rollup/rollup-linux-ppc64-musl': 4.60.3 + '@rollup/rollup-linux-riscv64-gnu': 4.60.3 + '@rollup/rollup-linux-riscv64-musl': 4.60.3 + '@rollup/rollup-linux-s390x-gnu': 4.60.3 + '@rollup/rollup-linux-x64-gnu': 4.60.3 + '@rollup/rollup-linux-x64-musl': 4.60.3 + '@rollup/rollup-openbsd-x64': 4.60.3 + '@rollup/rollup-openharmony-arm64': 4.60.3 + '@rollup/rollup-win32-arm64-msvc': 4.60.3 + '@rollup/rollup-win32-ia32-msvc': 4.60.3 + '@rollup/rollup-win32-x64-gnu': 4.60.3 + '@rollup/rollup-win32-x64-msvc': 4.60.3 + fsevents: 2.3.3 + + search-insights@2.17.3: {} + + shiki@2.5.0: + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/langs': 2.5.0 + '@shikijs/themes': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + + speakingurl@14.0.1: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + + tabbable@6.4.0: {} + + trim-lines@3.0.1: {} + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@5.4.21: + dependencies: + esbuild: 0.21.5 + postcss: 8.5.14 + rollup: 4.60.3 + optionalDependencies: + fsevents: 2.3.3 + + vitepress@1.6.4(@algolia/client-search@5.52.1)(postcss@8.5.14)(search-insights@2.17.3): + dependencies: + '@docsearch/css': 3.8.2 + '@docsearch/js': 3.8.2(@algolia/client-search@5.52.1)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.81 + '@shikijs/core': 2.5.0 + '@shikijs/transformers': 2.5.0 + '@shikijs/types': 2.5.0 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21)(vue@3.5.34) + '@vue/devtools-api': 7.7.9 + '@vue/shared': 3.5.34 + '@vueuse/core': 12.8.2 + '@vueuse/integrations': 12.8.2(focus-trap@7.8.0) + focus-trap: 7.8.0 + mark.js: 8.11.1 + minisearch: 7.2.0 + shiki: 2.5.0 + vite: 5.4.21 + vue: 3.5.34 + optionalDependencies: + postcss: 8.5.14 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + + vue@3.5.34: + dependencies: + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-sfc': 3.5.34 + '@vue/runtime-dom': 3.5.34 + '@vue/server-renderer': 3.5.34(vue@3.5.34) + '@vue/shared': 3.5.34 + + yauzl@3.3.0: + dependencies: + buffer-crc32: 0.2.13 + pend: 1.2.0 + + yazl@3.3.1: + dependencies: + buffer-crc32: 1.0.0 + + zip-lib@1.3.2: + dependencies: + yauzl: 3.3.0 + yazl: 3.3.1 + + zwitch@2.0.4: {} diff --git a/tests/e2e/test-web-ui-assets.js b/tests/e2e/test-web-ui-assets.js index 1db5c145..46e04330 100644 --- a/tests/e2e/test-web-ui-assets.js +++ b/tests/e2e/test-web-ui-assets.js @@ -44,31 +44,19 @@ module.exports = async function testWebUiAssets(ctx) { assert(!rootPage.body.includes('src="web-ui/app.js"'), 'root web ui page should not use a relative app entry'); assert(!/ +
+
+ {{ t('market.title') }} +
+ -
- -
- - -
- -
{{ skillsRootPath || skillsDefaultRootPath }}
- -
-
- {{ t('market.summary.target') }} - {{ skillsTargetLabel }} -
-
- {{ t('market.summary.total') }} - {{ skillsList.length }} -
-
- {{ t('market.summary.configured') }} - {{ skillsConfiguredCount }} -
-
- {{ t('market.summary.missing') }} - {{ skillsMissingSkillFileCount }} -
-
- {{ t('market.summary.importable') }} - {{ skillsImportList.length }} -
-
- {{ t('market.summary.importableDirect') }} - {{ skillsImportConfiguredCount }} -
-
-
-
-
-
{{ t('market.installed.title') }}
-
{{ t('market.installed.note') }}
-
- -
-
{{ t('market.local.loading') }}
-
{{ t('market.local.empty') }}
-
-
-
-
{{ skill.displayName || skill.name }}
-
{{ skill.description || skill.path }}
-
- - {{ skill.hasSkillFile ? t('market.pill.verified') : t('market.pill.missingSkill') }} - -
-
+ +
+
+
+ {{ t('market.installed.title') }} + {{ skillsList.length }} +
+
- -
-
-
-
{{ t('market.import.title') }}
-
{{ t('market.import.note', { target: skillsTargetLabel }) }}
-
- -
-
{{ t('market.import.loading') }}
-
{{ t('market.import.empty') }}
-
-
-
-
{{ skill.displayName || skill.name }}
-
{{ skill.sourceLabel }} · {{ skill.sourcePath }}
-
- - {{ skill.hasSkillFile ? t('market.pill.importableDirect') : t('market.pill.importMissing') }} - +
{{ t('market.local.loading') }}
+
{{ t('market.local.empty') }}
+
+
+
+ {{ skill.displayName || skill.name }} + {{ skill.path }}
+ + {{ skill.hasSkillFile ? t('market.pill.verified') : t('market.pill.missingSkill') }} +
+
-
-
-
-
{{ t('market.actions.title') }}
-
{{ t('market.actions.note') }}
-
-
-
- - +
+
{{ t('market.import.loading') }}
+
{{ t('market.import.empty') }}
+
+ +
+ -
-
- -
-
-
-
{{ t('market.help.title') }}
-
-
-
-
-
-
{{ t('market.help.target.title') }}
-
{{ t('market.help.target.copy', { target: skillsTargetLabel }) }}
-
-
-
-
-
{{ t('market.help.crossImport.title') }}
-
{{ t('market.help.crossImport.copy') }}
-
-
-
-
-
{{ t('market.help.zipImport.title') }}
-
{{ t('market.help.zipImport.copy') }}
+ +
+
+
+ {{ skill.displayName || skill.name }} + {{ skill.sourceLabel }}
+
diff --git a/web-ui/partials/index/panel-settings.html b/web-ui/partials/index/panel-settings.html index c8a792ec..525da006 100644 --- a/web-ui/partials/index/panel-settings.html +++ b/web-ui/partials/index/panel-settings.html @@ -19,7 +19,8 @@ :aria-selected="settingsTab === 'general'" :tabindex="settingsTab === 'general' ? 0 : -1" :class="['segmented-option', { active: settingsTab === 'general' }]" - @click="onSettingsTabClick('general')">{{ t('settings.tab.general') }} + @click="onSettingsTabClick('general')" + @keydown="onSettingsTabKeydown($event, 'general')">{{ t('settings.tab.general') }} + @click="onSettingsTabClick('data')" + @keydown="onSettingsTabKeydown($event, 'data')">{{ t('settings.tab.data') }}
diff --git a/web-ui/partials/index/panel-usage.html b/web-ui/partials/index/panel-usage.html index 21e6e65a..8be5180a 100644 --- a/web-ui/partials/index/panel-usage.html +++ b/web-ui/partials/index/panel-usage.html @@ -1,4 +1,4 @@ - +
{{ t('usage.range.7d') }} -
-
{{ t('usage.loading') }}
-
{{ sessionsUsageError }}
-
{{ t('usage.empty') }}
+
+
+ + + + + +
+

{{ t('usage.loading') }}

+
+
+
+ + + +
+

{{ sessionsUsageError }}

+
+
+
+ + + + +
+

{{ t('usage.empty') }}

+
-
\ No newline at end of file +
diff --git a/web-ui/res/vue.runtime.global.prod.js b/web-ui/res/vue.runtime.global.prod.js new file mode 100644 index 00000000..228e76a8 --- /dev/null +++ b/web-ui/res/vue.runtime.global.prod.js @@ -0,0 +1,7 @@ +/** +* vue v3.5.30 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/var Vue=function(e){"use strict";var t,n;let l,r,i,s,o,a,u,c,f,p,d,h;function g(e){let t=Object.create(null);for(let n of e.split(","))t[n]=1;return e=>e in t}let _={},m=[],y=()=>{},b=()=>!1,S=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||97>e.charCodeAt(2)),C=e=>e.startsWith("onUpdate:"),x=Object.assign,w=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},k=Object.prototype.hasOwnProperty,E=(e,t)=>k.call(e,t),T=Array.isArray,A=e=>"function"==typeof e,O=e=>"string"==typeof e,R=e=>"symbol"==typeof e,N=e=>null!==e&&"object"==typeof e,P=e=>(N(e)||A(e))&&A(e.then)&&A(e.catch),M=Object.prototype.toString,I=e=>O(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,L=g(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),F=e=>{let t=Object.create(null);return n=>t[n]||(t[n]=e(n))},j=/-\w/g,D=F(e=>e.replace(j,e=>e.slice(1).toUpperCase())),V=/\B([A-Z])/g,U=F(e=>e.replace(V,"-$1").toLowerCase()),B=F(e=>e.charAt(0).toUpperCase()+e.slice(1)),$=F(e=>e?`on${B(e)}`:""),H=(e,t)=>!Object.is(e,t),W=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:l,value:n})},z=e=>{let t=parseFloat(e);return isNaN(t)?e:t},q=e=>{let t=O(e)?Number(e):NaN;return isNaN(t)?e:t},G=()=>l||(l="u">typeof globalThis?globalThis:"u">typeof self?self:"u">typeof window?window:"u">typeof global?global:{}),J=g("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol");function X(e){if(T(e)){let t={};for(let n=0;n{if(e){let n=e.split(Y);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}(l):X(l);if(r)for(let e in r)t[e]=r[e]}return t}if(O(e)||N(e))return e}let Z=/;(?![^(]*\))/g,Y=/:([^]+)/,Q=/\/\*[^]*?\*\//g;function ee(e){let t="";if(O(e))t=e;else if(T(e))for(let n=0;nen(e,t))}let er=e=>!!(e&&!0===e.__v_isRef),ei=e=>O(e)?e:null==e?"":T(e)||N(e)&&(e.toString===M||!A(e.toString))?er(e)?ei(e.value):JSON.stringify(e,es,2):String(e),es=(e,t)=>{let n;if(er(t))return es(e,t.value);if("[object Map]"===(n=t,M.call(n)))return{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],l)=>(e[eo(t,l)+" =>"]=n,e),{})};{let e;if("[object Set]"===(e=t,M.call(e)))return{[`Set(${t.size})`]:[...t.values()].map(e=>eo(e))};else{if(R(t))return eo(t);let e;if(N(t)&&!T(t)&&"[object Object]"!==(e=t,M.call(e)))return String(t)}}return t},eo=(e,t="")=>{var n;return R(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};class ea{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=r,!e&&r&&(this.index=(r.scopes||(r.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){let e,t;if(this._isPaused=!0,this.scopes)for(e=0,t=this.scopes.length;e0&&0==--this._on&&(r=this.prevScope,this.prevScope=void 0)}stop(e){if(this._active){let t,n;for(t=0,this._active=!1,n=this.effects.length;t0)){if(o){let e=o;for(o=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}for(;s;){let t=s;for(s=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,1&t.flags)try{t.trigger()}catch(t){e||(e=t)}t=n}}if(e)throw e}}function eh(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function eg(e){let t,n=e.depsTail,l=n;for(;l;){let e=l.prevDep;-1===l.version?(l===n&&(n=e),em(l),function(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}(l)):t=l,l.dep.activeLink=l.prevActiveLink,l.prevActiveLink=void 0,l=e}e.deps=t,e.depsTail=n}function ev(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(e_(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function e_(e){if(4&e.flags&&!(16&e.flags)||(e.flags&=-17,e.globalVersion===ew)||(e.globalVersion=ew,!e.isSSR&&128&e.flags&&(!e.deps&&!e._dirty||!ev(e))))return;e.flags|=2;let t=e.dep,n=i,l=ey;i=e,ey=!0;try{eh(e);let n=e.fn(e._value);(0===t.version||H(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{i=n,ey=l,eg(e),e.flags&=-3}}function em(e,t=!1){let{dep:n,prevSub:l,nextSub:r}=e;if(l&&(l.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=l,e.nextSub=void 0),n.subs===e&&(n.subs=l,!l&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)em(e,!0)}t||--n.sc||!n.map||n.map.delete(n.key)}let ey=!0,eb=[];function eS(){eb.push(ey),ey=!1}function eC(){let e=eb.pop();ey=void 0===e||e}function ex(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=i;i=void 0;try{t()}finally{i=e}}}let ew=0;class ek{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class eE{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!i||!ey||i===this.computed)return;let t=this.activeLink;if(void 0===t||t.sub!==i)t=this.activeLink=new ek(i,this),i.deps?(t.prevDep=i.depsTail,i.depsTail.nextDep=t,i.depsTail=t):i.deps=i.depsTail=t,function e(t){if(t.dep.sc++,4&t.sub.flags){let n=t.dep.computed;if(n&&!t.dep.subs){n.flags|=20;for(let t=n.deps;t;t=t.nextDep)e(t)}let l=t.dep.subs;l!==t&&(t.prevSub=l,l&&(l.nextSub=t)),t.dep.subs=t}}(t);else if(-1===t.version&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=i.depsTail,t.nextDep=void 0,i.depsTail.nextDep=t,i.depsTail=t,i.deps===t&&(i.deps=e)}return t}trigger(e){this.version++,ew++,this.notify(e)}notify(e){ef++;try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{ed()}}}let eT=new WeakMap,eA=Symbol(""),eO=Symbol(""),eR=Symbol("");function eN(e,t,n){if(ey&&i){let t=eT.get(e);t||eT.set(e,t=new Map);let l=t.get(n);l||(t.set(n,l=new eE),l.map=t,l.key=n),l.track()}}function eP(e,t,n,l,r,i){let s=eT.get(e);if(!s)return void ew++;let o=e=>{e&&e.trigger()};if(ef++,"clear"===t)s.forEach(o);else{let r=T(e),i=r&&I(n);if(r&&"length"===n){let e=Number(l);s.forEach((t,n)=>{("length"===n||n===eR||!R(n)&&n>=e)&&o(t)})}else switch((void 0!==n||s.has(void 0))&&o(s.get(n)),i&&o(s.get(eR)),t){case"add":if(r)i&&o(s.get("length"));else{let t;o(s.get(eA));"[object Map]"===(t=e,M.call(t))&&o(s.get(eO))}break;case"delete":if(!r){let t;o(s.get(eA));"[object Map]"===(t=e,M.call(t))&&o(s.get(eO))}break;case"set":let a;"[object Map]"===(a=e,M.call(a))&&o(s.get(eA))}}ed()}function eM(e){let t=ta(e);return t===e?t:(eN(t,"iterate",eR),ts(e)?t:t.map(tc))}function eI(e){return eN(e=ta(e),"iterate",eR),e}function eL(e,t){return ti(e)?tr(e)?tf(tc(t)):tf(t):tc(t)}let eF={__proto__:null,[Symbol.iterator](){return ej(this,Symbol.iterator,e=>eL(this,e))},concat(...e){return eM(this).concat(...e.map(e=>T(e)?eM(e):e))},entries(){return ej(this,"entries",e=>(e[1]=eL(this,e[1]),e))},every(e,t){return eV(this,"every",e,t,void 0,arguments)},filter(e,t){return eV(this,"filter",e,t,e=>e.map(e=>eL(this,e)),arguments)},find(e,t){return eV(this,"find",e,t,e=>eL(this,e),arguments)},findIndex(e,t){return eV(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return eV(this,"findLast",e,t,e=>eL(this,e),arguments)},findLastIndex(e,t){return eV(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return eV(this,"forEach",e,t,void 0,arguments)},includes(...e){return eB(this,"includes",e)},indexOf(...e){return eB(this,"indexOf",e)},join(e){return eM(this).join(e)},lastIndexOf(...e){return eB(this,"lastIndexOf",e)},map(e,t){return eV(this,"map",e,t,void 0,arguments)},pop(){return e$(this,"pop")},push(...e){return e$(this,"push",e)},reduce(e,...t){return eU(this,"reduce",e,t)},reduceRight(e,...t){return eU(this,"reduceRight",e,t)},shift(){return e$(this,"shift")},some(e,t){return eV(this,"some",e,t,void 0,arguments)},splice(...e){return e$(this,"splice",e)},toReversed(){return eM(this).toReversed()},toSorted(e){return eM(this).toSorted(e)},toSpliced(...e){return eM(this).toSpliced(...e)},unshift(...e){return e$(this,"unshift",e)},values(){return ej(this,"values",e=>eL(this,e))}};function ej(e,t,n){let l=eI(e),r=l[t]();return l===e||ts(e)||(r._next=r.next,r.next=()=>{let e=r._next();return e.done||(e.value=n(e.value)),e}),r}let eD=Array.prototype;function eV(e,t,n,l,r,i){let s=eI(e),o=s!==e&&!ts(e),a=s[t];if(a!==eD[t]){let t=a.apply(e,i);return o?tc(t):t}let u=n;s!==e&&(o?u=function(t,l){return n.call(this,eL(e,t),l,e)}:n.length>2&&(u=function(t,l){return n.call(this,t,l,e)}));let c=a.call(s,u,l);return o&&r?r(c):c}function eU(e,t,n,l){let r=eI(e),i=r!==e&&!ts(e),s=n,o=!1;r!==e&&(i?(o=0===l.length,s=function(t,l,r){return o&&(o=!1,t=eL(e,t)),n.call(this,t,eL(e,l),r,e)}):n.length>3&&(s=function(t,l,r){return n.call(this,t,l,r,e)}));let a=r[t](s,...l);return o?eL(e,a):a}function eB(e,t,n){let l=ta(e);eN(l,"iterate",eR);let r=l[t](...n);return(-1===r||!1===r)&&to(n[0])?(n[0]=ta(n[0]),l[t](...n)):r}function e$(e,t,n=[]){eS(),ef++;let l=ta(e)[t].apply(e,n);return ed(),eC(),l}let eH=g("__proto__,__v_isRef,__isVue"),eW=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>"arguments"!==e&&"caller"!==e).map(e=>Symbol[e]).filter(R));function eK(e){R(e)||(e=String(e));let t=ta(this);return eN(t,"has",e),t.hasOwnProperty(e)}class ez{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if("__v_skip"===t)return e.__v_skip;let l=this._isReadonly,r=this._isShallow;if("__v_isReactive"===t)return!l;if("__v_isReadonly"===t)return l;if("__v_isShallow"===t)return r;if("__v_raw"===t)return n===(l?r?e7:e9:r?e5:e3).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let i=T(e);if(!l){let e;if(i&&(e=eF[t]))return e;if("hasOwnProperty"===t)return eK}let s=Reflect.get(e,t,tp(e)?e:n);if((R(t)?eW.has(t):eH(t))||(l||eN(e,"get",t),r))return s;if(tp(s)){let e=i&&I(t)?s:s.value;return l&&N(e)?tn(e):e}return N(s)?l?tn(s):te(s):s}}class eq extends ez{constructor(e=!1){super(!1,e)}set(e,t,n,l){let r=e[t],i=T(e)&&I(t);if(!this._isShallow){let e=ti(r);if(ts(n)||ti(n)||(r=ta(r),n=ta(n)),!i&&tp(r)&&!tp(n))if(e)return!0;else return r.value=n,!0}let s=i?Number(t)e;function e0(e){return function(){return"delete"!==e&&("clear"===e?void 0:this)}}function e1(e,t){let n,l=(x(n={get(n){let l=this.__v_raw,r=ta(l),i=ta(n);e||(H(n,i)&&eN(r,"get",n),eN(r,"get",i));let{has:s}=Reflect.getPrototypeOf(r),o=t?eQ:e?tf:tc;return s.call(r,n)?o(l.get(n)):s.call(r,i)?o(l.get(i)):void(l!==r&&l.get(n))},get size(){let t=this.__v_raw;return e||eN(ta(t),"iterate",eA),t.size},has(t){let n=this.__v_raw,l=ta(n),r=ta(t);return e||(H(t,r)&&eN(l,"has",t),eN(l,"has",r)),t===r?n.has(t):n.has(t)||n.has(r)},forEach(n,l){let r=this,i=r.__v_raw,s=ta(i),o=t?eQ:e?tf:tc;return e||eN(s,"iterate",eA),i.forEach((e,t)=>n.call(l,o(e),o(t),r))}},e?{add:e0("add"),set:e0("set"),delete:e0("delete"),clear:e0("clear")}:{add(e){let n=ta(this),l=Reflect.getPrototypeOf(n),r=ta(e),i=t||ts(e)||ti(e)?e:r;return l.has.call(n,i)||H(e,i)&&l.has.call(n,e)||H(r,i)&&l.has.call(n,r)||(n.add(i),eP(n,"add",i,i)),this},set(e,n){t||ts(n)||ti(n)||(n=ta(n));let l=ta(this),{has:r,get:i}=Reflect.getPrototypeOf(l),s=r.call(l,e);s||(e=ta(e),s=r.call(l,e));let o=i.call(l,e);return l.set(e,n),s?H(n,o)&&eP(l,"set",e,n):eP(l,"add",e,n),this},delete(e){let t=ta(this),{has:n,get:l}=Reflect.getPrototypeOf(t),r=n.call(t,e);r||(e=ta(e),r=n.call(t,e)),l&&l.call(t,e);let i=t.delete(e);return r&&eP(t,"delete",e,void 0),i},clear(){let e=ta(this),t=0!==e.size,n=e.clear();return t&&eP(e,"clear",void 0,void 0),n}}),["keys","values","entries",Symbol.iterator].forEach(l=>{n[l]=function(...n){let r,i=this.__v_raw,s=ta(i),o="[object Map]"===(r=s,M.call(r)),a="entries"===l||l===Symbol.iterator&&o,u=i[l](...n),c=t?eQ:e?tf:tc;return e||eN(s,"iterate","keys"===l&&o?eO:eA),x(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:a?[c(e[0]),c(e[1])]:c(e),done:t}}})}}),n);return(t,n,r)=>"__v_isReactive"===n?!e:"__v_isReadonly"===n?e:"__v_raw"===n?t:Reflect.get(E(l,n)&&n in t?l:t,n,r)}let e2={get:e1(!1,!1)},e6={get:e1(!1,!0)},e8={get:e1(!0,!1)},e4={get:e1(!0,!0)},e3=new WeakMap,e5=new WeakMap,e9=new WeakMap,e7=new WeakMap;function te(e){return ti(e)?e:tl(e,!1,eJ,e2,e3)}function tt(e){return tl(e,!1,eZ,e6,e5)}function tn(e){return tl(e,!0,eX,e8,e9)}function tl(e,t,n,l,r){var i;let s;if(!N(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;let o=(i=e).__v_skip||!Object.isExtensible(i)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((s=i,M.call(s)).slice(8,-1));if(0===o)return e;let a=r.get(e);if(a)return a;let u=new Proxy(e,2===o?l:n);return r.set(e,u),u}function tr(e){return ti(e)?tr(e.__v_raw):!!(e&&e.__v_isReactive)}function ti(e){return!!(e&&e.__v_isReadonly)}function ts(e){return!!(e&&e.__v_isShallow)}function to(e){return!!e&&!!e.__v_raw}function ta(e){let t=e&&e.__v_raw;return t?ta(t):e}function tu(e){return!E(e,"__v_skip")&&Object.isExtensible(e)&&K(e,"__v_skip",!0),e}let tc=e=>N(e)?te(e):e,tf=e=>N(e)?tn(e):e;function tp(e){return!!e&&!0===e.__v_isRef}function td(e){return tg(e,!1)}function th(e){return tg(e,!0)}function tg(e,t){return tp(e)?e:new tv(e,t)}class tv{constructor(e,t){this.dep=new eE,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:ta(e),this._value=t?e:tc(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||ts(e)||ti(e);H(e=n?e:ta(e),t)&&(this._rawValue=e,this._value=n?e:tc(e),this.dep.trigger())}}function t_(e){return tp(e)?e.value:e}let tm={get:(e,t,n)=>"__v_raw"===t?e:t_(Reflect.get(e,t,n)),set:(e,t,n,l)=>{let r=e[t];return tp(r)&&!tp(n)?(r.value=n,!0):Reflect.set(e,t,n,l)}};function ty(e){return tr(e)?e:new Proxy(e,tm)}class tb{constructor(e){this.__v_isRef=!0,this._value=void 0;const t=this.dep=new eE,{get:n,set:l}=e(t.track.bind(t),t.trigger.bind(t));this._get=n,this._set=l}get value(){return this._value=this._get()}set value(e){this._set(e)}}function tS(e){return new tb(e)}class tC{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._raw=ta(e);let l=!0,r=e;if(!T(e)||!I(String(t)))do l=!to(r)||ts(r);while(l&&(r=r.__v_raw));this._shallow=l}get value(){let e=this._object[this._key];return this._shallow&&(e=t_(e)),this._value=void 0===e?this._defaultValue:e}set value(e){if(this._shallow&&tp(this._raw[this._key])){let t=this._object[this._key];if(tp(t)){t.value=e;return}}this._object[this._key]=e}get dep(){var e,t;let n;return e=this._raw,t=this._key,(n=eT.get(e))&&n.get(t)}}class tx{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}class tw{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new eE(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=ew-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(8&this.flags)&&i!==this)return ep(this,!0),!0}get value(){let e=this.dep.track();return e_(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}let tk={},tE=new WeakMap;function tT(e,t=!1,n=d){if(n){let t=tE.get(n);t||tE.set(n,t=[]),t.push(e)}}function tA(e,t=1/0,n){if(t<=0||!N(e)||e.__v_skip||((n=n||new Map).get(e)||0)>=t)return e;if(n.set(e,t),t--,tp(e))tA(e.value,t,n);else if(T(e))for(let l=0;l{tA(e,t,n)});else{let l;if("[object Object]"===(l=e,M.call(l))){for(let l in e)tA(e[l],t,n);for(let l of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,l)&&tA(e[l],t,n)}}}return e}function tO(e,t,n,l){try{return l?e(...l):e()}catch(e){tN(e,t,n)}}function tR(e,t,n,l){if(A(e)){let r=tO(e,t,n,l);return r&&P(r)&&r.catch(e=>{tN(e,t,n)}),r}if(T(e)){let r=[];for(let i=0;i=tK(n)?tP.push(e):tP.splice(function(e){let t=tM+1,n=tP.length;for(;t>>1,r=tP[l],i=tK(r);itK(e)-tK(t));if(tI.length=0,tL)return void tL.push(...e);for(tF=0,tL=e;tFnull==e.id?2&e.flags?-1:1/0:e.id,tz=null,tq=null;function tG(e){let t=tz;return tz=e,tq=e&&e.type.__scopeId||null,t}function tJ(e,t=tz,n){if(!t||e._n)return e;let l=(...n)=>{let r;l._d&&l5(-1);let i=tG(t);try{r=e(...n)}finally{tG(i),l._d&&l5(1)}return r};return l._n=!0,l._c=!0,l._d=!0,l}function tX(e,t,n,l){let r=e.dirs,i=t&&t.dirs;for(let s=0;s1)return n&&A(t)?t.call(l&&l.proxy):t}}let tQ=Symbol.for("v-scx");function t0(e,t){return t1(e,null,{flush:"sync"})}function t1(e,t,n=_){let{flush:l}=n,i=x({},n),s=rv;i.call=(e,t,n)=>tR(e,s,t,n);let o=!1;return"post"===l?i.scheduler=e=>{lj(e,s&&s.suspense)}:"sync"!==l&&(o=!0,i.scheduler=(e,t)=>{t?e():tU(e)}),i.augmentJob=e=>{t&&(e.flags|=4),o&&(e.flags|=2,s&&(e.id=s.uid,e.i=s))},function(e,t,n=_){let l,i,s,o,{immediate:a,deep:u,once:c,scheduler:f,augmentJob:p,call:h}=n,g=e=>u?e:ts(e)||!1===u||0===u?tA(e,1):tA(e),m=!1,b=!1;if(tp(e)?(i=()=>e.value,m=ts(e)):tr(e)?(i=()=>g(e),m=!0):T(e)?(b=!0,m=e.some(e=>tr(e)||ts(e)),i=()=>e.map(e=>tp(e)?e.value:tr(e)?g(e):A(e)?h?h(e,2):e():void 0)):i=A(e)?t?h?()=>h(e,2):e:()=>{if(s){eS();try{s()}finally{eC()}}let t=d;d=l;try{return h?h(e,3,[o]):e(o)}finally{d=t}}:y,t&&u){let e=i,t=!0===u?1/0:u;i=()=>tA(e(),t)}let S=r,C=()=>{l.stop(),S&&S.active&&w(S.effects,l)};if(c&&t){let e=t;t=(...t)=>{e(...t),C()}}let x=b?Array(e.length).fill(tk):tk,k=e=>{if(1&l.flags&&(l.dirty||e))if(t){let e=l.run();if(u||m||(b?e.some((e,t)=>H(e,x[t])):H(e,x))){s&&s();let n=d;d=l;try{let n=[e,x===tk?void 0:b&&x[0]===tk?[]:x,o];x=e,h?h(t,3,n):t(...n)}finally{d=n}}}else l.run()};return p&&p(k),(l=new ec(i)).scheduler=f?()=>f(k,!1):k,o=e=>tT(e,!1,l),s=l.onStop=()=>{let e=tE.get(l);if(e){if(h)h(e,4);else for(let t of e)t();tE.delete(l)}},t?a?k(!0):x=l.run():f?f(k.bind(null,!0),!0):l.run(),C.pause=l.pause.bind(l),C.resume=l.resume.bind(l),C.stop=C,C}(e,t,i)}function t2(e,t,n){let l,r=this.proxy,i=O(e)?e.includes(".")?t6(r,e):()=>r[e]:e.bind(r,r);A(t)?l=t:(l=t.handler,n=t);let s=rm(this),o=t1(i,l.bind(r),n);return s(),o}function t6(e,t){let n=t.split(".");return()=>{let t=e;for(let e=0;ee&&(e.disabled||""===e.disabled),t3=e=>e&&(e.defer||""===e.defer),t5=e=>"u">typeof SVGElement&&e instanceof SVGElement,t9=e=>"function"==typeof MathMLElement&&e instanceof MathMLElement,t7=(e,t)=>{let n=e&&e.to;return O(n)?t?t(n):null:n},ne={name:"Teleport",__isTeleport:!0,process(e,t,n,l,r,i,s,o,a,u){let{mc:c,pc:f,pbc:p,o:{insert:d,querySelector:h,createText:g}}=u,_=t4(t.props),{shapeFlag:m,children:y,dynamicChildren:b}=t;if(null==e){let e=t.el=g(""),u=t.anchor=g("");d(e,n,l),d(u,n,l);let f=(e,t)=>{16&m&&c(y,e,t,r,i,s,o,a)},p=()=>{let e=t.target=t7(t.props,h),n=nl(e,t,g,d);e&&("svg"!==s&&t5(e)?s="svg":"mathml"!==s&&t9(e)&&(s="mathml"),r&&r.isCE&&(r.ce._teleportTargets||(r.ce._teleportTargets=new Set)).add(e),_||(f(e,n),nn(t,!1)))};_&&(f(n,u),nn(t,!0)),t3(t.props)?(t.el.__isMounted=!1,lj(()=>{p(),delete t.el.__isMounted},i)):p()}else{if(t3(t.props)&&!1===e.el.__isMounted)return void lj(()=>{ne.process(e,t,n,l,r,i,s,o,a,u)},i);t.el=e.el,t.targetStart=e.targetStart;let c=t.anchor=e.anchor,d=t.target=e.target,g=t.targetAnchor=e.targetAnchor,m=t4(e.props),y=m?n:d,S=m?c:g;if("svg"===s||t5(d)?s="svg":("mathml"===s||t9(d))&&(s="mathml"),b?(p(e.dynamicChildren,b,y,r,i,s,o),lH(e,t,!0)):a||f(e,t,y,S,r,i,s,o,!1),_)m?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):nt(t,n,c,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){let e=t.target=t7(t.props,h);e&&nt(t,e,null,u,0)}else m&&nt(t,d,g,u,1);nn(t,_)}},remove(e,t,n,{um:l,o:{remove:r}},i){let{shapeFlag:s,children:o,anchor:a,targetStart:u,targetAnchor:c,target:f,props:p}=e;if(f&&(r(u),r(c)),i&&r(a),16&s){let e=i||!t4(p);for(let r=0;r{e.isMounted=!0}),nJ(()=>{e.isUnmounting=!0}),e}let no=[Function,Array],na={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:no,onEnter:no,onAfterEnter:no,onEnterCancelled:no,onBeforeLeave:no,onLeave:no,onAfterLeave:no,onLeaveCancelled:no,onBeforeAppear:no,onAppear:no,onAfterAppear:no,onAppearCancelled:no},nu=e=>{let t=e.subTree;return t.component?nu(t.component):t};function nc(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==l0){t=n;break}}return t}let nf={name:"BaseTransition",props:na,setup(e,{slots:t}){let n=r_(),l=ns();return()=>{let r=t.default&&n_(t.default(),!0);if(!r||!r.length)return;let i=nc(r),s=ta(e),{mode:o}=s;if(l.isLeaving)return nh(i);let a=ng(i);if(!a)return nh(i);let u=nd(a,s,l,n,e=>u=e);a.type!==l0&&nv(a,u);let c=n.subTree&&ng(n.subTree);if(c&&c.type!==l0&&!rt(c,a)&&nu(n).type!==l0){let e=nd(c,s,l,n);if(nv(c,e),"out-in"===o&&a.type!==l0)return l.isLeaving=!0,e.afterLeave=()=>{l.isLeaving=!1,8&n.job.flags||n.update(),delete e.afterLeave,c=void 0},nh(i);"in-out"===o&&a.type!==l0?e.delayLeave=(e,t,n)=>{np(l,c)[String(c.key)]=c,e[nr]=()=>{t(),e[nr]=void 0,delete u.delayedLeave,c=void 0},u.delayedLeave=()=>{n(),delete u.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return i}}};function np(e,t){let{leavingVNodes:n}=e,l=n.get(t.type);return l||(l=Object.create(null),n.set(t.type,l)),l}function nd(e,t,n,l,r){let{appear:i,mode:s,persisted:o=!1,onBeforeEnter:a,onEnter:u,onAfterEnter:c,onEnterCancelled:f,onBeforeLeave:p,onLeave:d,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:_,onAppear:m,onAfterAppear:y,onAppearCancelled:b}=t,S=String(e.key),C=np(n,e),x=(e,t)=>{e&&tR(e,l,9,t)},w=(e,t)=>{let n=t[1];x(e,t),T(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},k={mode:s,persisted:o,beforeEnter(t){let l=a;if(!n.isMounted)if(!i)return;else l=_||a;t[nr]&&t[nr](!0);let r=C[S];r&&rt(e,r)&&r.el[nr]&&r.el[nr](),x(l,[t])},enter(t){if(C[S]===e)return;let l=u,r=c,s=f;if(!n.isMounted)if(!i)return;else l=m||u,r=y||c,s=b||f;let o=!1;t[ni]=e=>{o||(o=!0,e?x(s,[t]):x(r,[t]),k.delayedLeave&&k.delayedLeave(),t[ni]=void 0)};let a=t[ni].bind(null,!1);l?w(l,[t,a]):a()},leave(t,l){let r=String(e.key);if(t[ni]&&t[ni](!0),n.isUnmounting)return l();x(p,[t]);let i=!1;t[nr]=n=>{i||(i=!0,l(),n?x(g,[t]):x(h,[t]),t[nr]=void 0,C[r]===e&&delete C[r])};let s=t[nr].bind(null,!1);C[r]=e,d?w(d,[t,s]):s()},clone(e){let i=nd(e,t,n,l,r);return r&&r(i),i}};return k}function nh(e){if(nF(e))return(e=ro(e)).children=null,e}function ng(e){if(!nF(e))return e.type.__isTeleport&&e.children?nc(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(16&t)return n[0];if(32&t&&A(n.default))return n.default()}}function nv(e,t){6&e.shapeFlag&&e.component?(e.transition=t,nv(e.component.subTree,t)):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function n_(e,t=!1,n){let l=[],r=0;for(let i=0;i1)for(let e=0;enC(e,t&&(T(t)?t[i]:t),n,l,r));if(nI(l)&&!r){512&l.shapeFlag&&l.type.__asyncResolved&&l.component.subTree.component&&nC(e,t,n,l.component.subTree);return}let i=4&l.shapeFlag?rE(l.component):l.el,s=r?null:i,{i:o,r:a}=e,u=t&&t.r,c=o.refs===_?o.refs={}:o.refs,f=o.setupState,p=ta(f),d=f===_?b:e=>!nb(c,e)&&E(p,e),h=(e,t)=>!(t&&nb(c,t));if(null!=u&&u!==a&&(nx(t),O(u)?(c[u]=null,d(u)&&(f[u]=null)):tp(u)&&(h(u,t.k)&&(u.value=null),t.k&&(c[t.k]=null))),A(a))tO(a,o,12,[s,c]);else{let t=O(a),l=tp(a);if(t||l){let o=()=>{if(e.f){let n=t?d(a)?f[a]:c[a]:h()||!e.k?a.value:c[e.k];if(r)T(n)&&w(n,i);else if(T(n))n.includes(i)||n.push(i);else if(t)c[a]=[i],d(a)&&(f[a]=c[a]);else{let t=[i];h(a,e.k)&&(a.value=t),e.k&&(c[e.k]=t)}}else t?(c[a]=s,d(a)&&(f[a]=s)):l&&(h(a,e.k)&&(a.value=s),e.k&&(c[e.k]=s))};if(s){let t=()=>{o(),nS.delete(e)};t.id=-1,nS.set(e,t),lj(t,n)}else nx(e),o()}}}function nx(e){let t=nS.get(e);t&&(t.flags|=8,nS.delete(e))}let nw=!1,nk=()=>{nw||(console.error("Hydration completed but contains mismatches."),nw=!0)},nE=e=>{if(1===e.nodeType){if(e.namespaceURI.includes("svg")&&"foreignObject"!==e.tagName)return"svg";if(e.namespaceURI.includes("MathML"))return"mathml"}},nT=e=>8===e.nodeType;function nA(e){let{mt:t,p:n,o:{patchProp:l,createText:r,nextSibling:i,parentNode:s,remove:o,insert:a,createComment:u}}=e,c=(n,l,o,u,y,b=!1)=>{b=b||!!l.dynamicChildren;let S=nT(n)&&"["===n.data,C=()=>h(n,l,o,u,y,S),{type:x,ref:w,shapeFlag:k,patchFlag:E}=l,T=n.nodeType;l.el=n,-2===E&&(b=!1,l.dynamicChildren=null);let A=null;switch(x){case lQ:3!==T?""===l.children?(a(l.el=r(""),s(n),n),A=n):A=C():(n.data!==l.children&&(nk(),n.data=l.children),A=i(n));break;case l0:m(n)?(A=i(n),_(l.el=n.content.firstChild,n,o)):A=8!==T||S?C():i(n);break;case l1:if(S&&(T=(n=i(n)).nodeType),1===T||3===T){A=n;let e=!l.children.length;for(let t=0;t{s=s||!!t.dynamicChildren;let{type:a,props:u,patchFlag:c,shapeFlag:f,dirs:d,transition:h}=t,g="input"===a||"option"===a;if(g||-1!==c){let a;d&&tX(t,null,n,"created");let y=!1;if(m(e)){y=l$(null,h)&&n&&n.vnode.props&&n.vnode.props.appear;let l=e.content.firstChild;if(y){let e=l.getAttribute("class");e&&(l.$cls=e),h.beforeEnter(l)}_(l,e,n),t.el=e=l}if(16&f&&!(u&&(u.innerHTML||u.textContent))){let l=p(e.firstChild,t,e,n,r,i,s);for(;l;){nN(e,1)||nk();let t=l;l=l.nextSibling,o(t)}}else if(8&f){let n=t.children;` +`===n[0]&&("PRE"===e.tagName||"TEXTAREA"===e.tagName)&&(n=n.slice(1));let{textContent:l}=e;l!==n&&l!==n.replace(/\r\n|\r/g,` +`)&&(nN(e,0)||nk(),e.textContent=t.children)}if(u){if(g||!s||48&c){let t=e.tagName.includes("-");for(let r in u)(g&&(r.endsWith("value")||"indeterminate"===r)||S(r)&&!L(r)||"."===r[0]||t&&!L(r))&&l(e,r,null,u[r],void 0,n)}else if(u.onClick)l(e,"onClick",null,u.onClick,void 0,n);else if(4&c&&tr(u.style))for(let e in u.style)u.style[e]}(a=u&&u.onVnodeBeforeMount)&&rd(a,n,t),d&&tX(t,null,n,"beforeMount"),((a=u&&u.onVnodeMounted)||d||y)&&lX(()=>{a&&rd(a,n,t),y&&h.enter(e),d&&tX(t,null,n,"mounted")},r)}return e.nextSibling},p=(e,t,l,s,o,u,f)=>{f=f||!!t.dynamicChildren;let p=t.children,d=p.length;for(let t=0;t{let{slotScopeIds:c}=t;c&&(r=r?r.concat(c):c);let f=s(e),d=p(i(e),t,f,n,l,r,o);return d&&nT(d)&&"]"===d.data?i(t.anchor=d):(nk(),a(t.anchor=u("]"),f,d),d)},h=(e,t,l,r,a,u)=>{if(nN(e.parentElement,1)||nk(),t.el=null,u){let t=g(e);for(;;){let n=i(e);if(n&&n!==t)o(n);else break}}let c=i(e),f=s(e);return o(e),n(null,t,f,c,l,r,nE(f),a),l&&(l.vnode.el=t.el,lw(l,t.el)),c},g=(e,t="[",n="]")=>{let l=0;for(;e;)if((e=i(e))&&nT(e)&&(e.data===t&&l++,e.data===n))if(0===l)return i(e);else l--;return e},_=(e,t,n)=>{let l=t.parentNode;l&&l.replaceChild(e,t);let r=n;for(;r;)r.vnode.el===t&&(r.vnode.el=r.subTree.el=e),r=r.parent},m=e=>1===e.nodeType&&"TEMPLATE"===e.tagName;return[(e,t)=>{if(!t.hasChildNodes()){n(null,e,t),tW(),t._vnode=e;return}c(t.firstChild,e,null,null,null),tW(),t._vnode=e},c]}let nO="data-allow-mismatch",nR={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function nN(e,t){if(0===t||1===t)for(;e&&!e.hasAttribute(nO);)e=e.parentElement;let n=e&&e.getAttribute(nO);if(null==n)return!1;{if(""===n)return!0;let e=n.split(",");return!!(0===t&&e.includes("children"))||e.includes(nR[t])}}let nP=G().requestIdleCallback||(e=>setTimeout(e,1)),nM=G().cancelIdleCallback||(e=>clearTimeout(e)),nI=e=>!!e.type.__asyncLoader;function nL(e,t){let{ref:n,props:l,children:r,ce:i}=t.vnode,s=ri(e,l,r);return s.ref=n,s.ce=i,delete t.vnode.ce,s}let nF=e=>e.type.__isKeepAlive;function nj(e,t){let n;if(T(e))return e.some(e=>nj(e,t));if(O(e))return e.split(",").includes(t);return"[object RegExp]"===(n=e,M.call(n))&&(e.lastIndex=0,e.test(t))}function nD(e,t){nU(e,"a",t)}function nV(e,t){nU(e,"da",t)}function nU(e,t,n=rv){let l=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(nH(t,l,n),n){let e=n.parent;for(;e&&e.parent;)nF(e.parent.vnode)&&function(e,t,n,l){let r=nH(t,e,l,!0);nX(()=>{w(l[t],r)},n)}(l,t,n,e),e=e.parent}}function nB(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function n$(e){return 128&e.shapeFlag?e.ssContent:e}function nH(e,t,n=rv,l=!1){if(n){let r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...l)=>{eS();let r=rm(n),i=tR(t,n,e,l);return r(),eC(),i});return l?r.unshift(i):r.push(i),i}}let nW=e=>(t,n=rv)=>{rS&&"sp"!==e||nH(e,(...e)=>t(...e),n)},nK=nW("bm"),nz=nW("m"),nq=nW("bu"),nG=nW("u"),nJ=nW("bum"),nX=nW("um"),nZ=nW("sp"),nY=nW("rtg"),nQ=nW("rtc");function n0(e,t=rv){nH("ec",e,t)}let n1="components",n2=Symbol.for("v-ndc");function n6(e,t,n=!0,l=!1){let r=tz||rv;if(r){let n=r.type;if(e===n1){let e=rT(n,!1);if(e&&(e===t||e===D(t)||e===B(D(t))))return n}let i=n8(r[e]||n[e],t)||n8(r.appContext[e],t);return!i&&l?n:i}}function n8(e,t){return e&&(e[t]||e[D(t)]||e[B(D(t))])}let n4=e=>e?rb(e)?rE(e):n4(e.parent):null,n3=x(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>n4(e.parent),$root:e=>n4(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>lr(e),$forceUpdate:e=>e.f||(e.f=()=>{tU(e.update)}),$nextTick:e=>e.n||(e.n=tV.bind(e.proxy)),$watch:e=>t2.bind(e)}),n5=(e,t)=>e!==_&&!e.__isScriptSetup&&E(e,t),n9={get({_:e},t){let n,l;if("__v_skip"===t)return!0;let{ctx:r,setupState:i,data:s,props:o,accessCache:a,type:u,appContext:c}=e;if("$"!==t[0]){let e=a[t];if(void 0!==e)switch(e){case 1:return i[t];case 2:return s[t];case 4:return r[t];case 3:return o[t]}else{if(n5(i,t))return a[t]=1,i[t];if(s!==_&&E(s,t))return a[t]=2,s[t];if(E(o,t))return a[t]=3,o[t];if(r!==_&&E(r,t))return a[t]=4,r[t];ln&&(a[t]=0)}}let f=n3[t];return f?("$attrs"===t&&eN(e.attrs,"get",""),f(e)):(n=u.__cssModules)&&(n=n[t])?n:r!==_&&E(r,t)?(a[t]=4,r[t]):E(l=c.config.globalProperties,t)?l[t]:void 0},set({_:e},t,n){let{data:l,setupState:r,ctx:i}=e;return n5(r,t)?(r[t]=n,!0):l!==_&&E(l,t)?(l[t]=n,!0):!E(e.props,t)&&!("$"===t[0]&&t.slice(1)in e)&&(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:l,appContext:r,props:i,type:s}},o){let a;return!!(n[o]||e!==_&&"$"!==o[0]&&E(e,o)||n5(t,o)||E(i,o)||E(l,o)||E(n3,o)||E(r.config.globalProperties,o)||(a=s.__cssModules)&&a[o])},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:E(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},n7=x({},n9,{get(e,t){if(t!==Symbol.unscopables)return n9.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!J(t)});function le(e){let t=r_();return t.setupContext||(t.setupContext=rk(t))}function lt(e){return T(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}let ln=!0;function ll(e,t,n){tR(T(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function lr(e){let t,n=e.type,{mixins:l,extends:r}=n,{mixins:i,optionsCache:s,config:{optionMergeStrategies:o}}=e.appContext,a=s.get(n);return a?t=a:i.length||l||r?(t={},i.length&&i.forEach(e=>li(t,e,o,!0)),li(t,n,o)):t=n,N(n)&&s.set(n,t),t}function li(e,t,n,l=!1){let{mixins:r,extends:i}=t;for(let s in i&&li(e,i,n,!0),r&&r.forEach(t=>li(e,t,n,!0)),t)if(l&&"expose"===s);else{let l=ls[s]||n&&n[s];e[s]=l?l(e[s],t[s]):t[s]}return e}let ls={data:lo,props:lf,emits:lf,methods:lc,computed:lc,beforeCreate:lu,created:lu,beforeMount:lu,mounted:lu,beforeUpdate:lu,updated:lu,beforeDestroy:lu,beforeUnmount:lu,destroyed:lu,unmounted:lu,activated:lu,deactivated:lu,errorCaptured:lu,serverPrefetch:lu,components:lc,directives:lc,watch:function(e,t){if(!e)return t;if(!t)return e;let n=x(Object.create(null),e);for(let l in t)n[l]=lu(e[l],t[l]);return n},provide:lo,inject:function(e,t){return lc(la(e),la(t))}};function lo(e,t){return t?e?function(){return x(A(e)?e.call(this,this):e,A(t)?t.call(this,this):t)}:t:e}function la(e){if(T(e)){let t={};for(let n=0;n"modelValue"===t||"model-value"===t?e.modelModifiers:e[`${t}Modifiers`]||e[`${D(t)}Modifiers`]||e[`${U(t)}Modifiers`];function lv(e,t,...n){let l;if(e.isUnmounted)return;let r=e.vnode.props||_,i=n,s=t.startsWith("update:"),o=s&&lg(r,t.slice(7));o&&(o.trim&&(i=n.map(e=>O(e)?e.trim():e)),o.number&&(i=n.map(z)));let a=r[l=$(t)]||r[l=$(D(t))];!a&&s&&(a=r[l=$(U(t))]),a&&tR(a,e,6,i);let u=r[l+"Once"];if(u){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,tR(u,e,6,i)}}let l_=new WeakMap;function lm(e,t){return!!e&&!!S(t)&&(E(e,(t=t.slice(2).replace(/Once$/,""))[0].toLowerCase()+t.slice(1))||E(e,U(t))||E(e,t))}function ly(e){let t,n,{type:l,vnode:r,proxy:i,withProxy:s,propsOptions:[o],slots:a,attrs:u,emit:c,render:f,renderCache:p,props:d,data:h,setupState:g,ctx:_,inheritAttrs:m}=e,y=tG(e);try{if(4&r.shapeFlag){let e=s||i;t=ru(f.call(e,e,p,d,g,h,_)),n=u}else t=ru(l.length>1?l(d,{attrs:u,slots:a,emit:c}):l(d,null)),n=l.props?u:lb(u)}catch(n){l2.length=0,tN(n,e,1),t=ri(l0)}let b=t;if(n&&!1!==m){let e=Object.keys(n),{shapeFlag:t}=b;e.length&&7&t&&(o&&e.some(C)&&(n=lS(n,o)),b=ro(b,n,!1,!0))}return r.dirs&&((b=ro(b,null,!1,!0)).dirs=b.dirs?b.dirs.concat(r.dirs):r.dirs),r.transition&&nv(b,r.transition),t=b,tG(y),t}let lb=e=>{let t;for(let n in e)("class"===n||"style"===n||S(n))&&((t||(t={}))[n]=e[n]);return t},lS=(e,t)=>{let n={};for(let l in e)C(l)&&l.slice(9)in t||(n[l]=e[l]);return n};function lC(e,t,n){let l=Object.keys(t);if(l.length!==Object.keys(e).length)return!0;for(let r=0;rObject.getPrototypeOf(e)===lk;function lT(e,t,n,l){let r,[i,s]=e.propsOptions,o=!1;if(t)for(let a in t){let u;if(L(a))continue;let c=t[a];i&&E(i,u=D(a))?s&&s.includes(u)?(r||(r={}))[u]=c:n[u]=c:lm(e.emitsOptions,a)||a in l&&c===l[a]||(l[a]=c,o=!0)}if(s){let t=ta(n),l=r||_;for(let r=0;r"_"===e||"_ctx"===e||"$stable"===e,lP=e=>T(e)?e.map(ru):[ru(e)],lM=(e,t,n)=>{if(t._n)return t;let l=tJ((...e)=>lP(t(...e)),n);return l._c=!1,l},lI=(e,t,n)=>{let l=e._ctx;for(let n in e){if(lN(n))continue;let r=e[n];if(A(r))t[n]=lM(n,r,l);else if(null!=r){let e=lP(r);t[n]=()=>e}}},lL=(e,t)=>{let n=lP(t);e.slots.default=()=>n},lF=(e,t,n)=>{for(let l in t)(n||!lN(l))&&(e[l]=t[l])},lj=lX;function lD(e){return lV(e,nA)}function lV(e,t){var n;let l,r;G().__VUE__=!0;let{insert:i,remove:s,patchProp:o,createElement:a,createText:c,createComment:f,setText:p,setElementText:d,parentNode:h,nextSibling:g,setScopeId:b=y,insertStaticContent:S}=e,C=(e,t,n,l=null,r=null,i=null,s,o=null,a=!!t.dynamicChildren)=>{if(e===t)return;e&&!rt(e,t)&&(l=es(e),et(e,r,i,!0),e=null),-2===t.patchFlag&&(a=!1,t.dynamicChildren=null);let{type:u,ref:c,shapeFlag:f}=t;switch(u){case lQ:w(e,t,n,l);break;case l0:k(e,t,n,l);break;case l1:null==e&&O(t,n,l,s);break;case lY:$(e,t,n,l,r,i,s,o,a);break;default:1&f?R(e,t,n,l,r,i,s,o,a):6&f?H(e,t,n,l,r,i,s,o,a):64&f?u.process(e,t,n,l,r,i,s,o,a,ef):128&f&&u.process(e,t,n,l,r,i,s,o,a,ef)}null!=c&&r?nC(c,e&&e.ref,i,t||e,!t):null==c&&e&&null!=e.ref&&nC(e.ref,null,i,e,!0)},w=(e,t,n,l)=>{if(null==e)i(t.el=c(t.children),n,l);else{let n=t.el=e.el;t.children!==e.children&&p(n,t.children)}},k=(e,t,n,l)=>{null==e?i(t.el=f(t.children||""),n,l):t.el=e.el},O=(e,t,n,l)=>{[e.el,e.anchor]=S(e.children,t,n,l,e.el,e.anchor)},R=(e,t,n,l,r,i,s,o,a)=>{if("svg"===t.type?s="svg":"math"===t.type&&(s="mathml"),null==e)M(t,n,l,r,i,s,o,a);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),j(e,t,r,i,s,o,a)}finally{n&&n._endPatch()}}},M=(e,t,n,l,r,s,u,c)=>{let f,p,{props:h,shapeFlag:g,transition:_,dirs:m}=e;if(f=e.el=a(e.type,s,h&&h.is,h),8&g?d(f,e.children):16&g&&F(e.children,f,null,l,r,lU(e,s),u,c),m&&tX(e,null,l,"created"),I(f,e,e.scopeId,u,l),h){for(let e in h)"value"===e||L(e)||o(f,e,null,h[e],s,l);"value"in h&&o(f,"value",null,h.value,s),(p=h.onVnodeBeforeMount)&&rd(p,l,e)}m&&tX(e,null,l,"beforeMount");let y=l$(r,_);y&&_.beforeEnter(f),i(f,t,n),((p=h&&h.onVnodeMounted)||y||m)&&lj(()=>{p&&rd(p,l,e),y&&_.enter(f),m&&tX(e,null,l,"mounted")},r)},I=(e,t,n,l,r)=>{if(n&&b(e,n),l)for(let t=0;t{for(let u=a;u{let a,u=t.el=e.el,{patchFlag:c,dynamicChildren:f,dirs:p}=t;c|=16&e.patchFlag;let h=e.props||_,g=t.props||_;if(n&&lB(n,!1),(a=g.onVnodeBeforeUpdate)&&rd(a,n,t,e),p&&tX(t,e,n,"beforeUpdate"),n&&lB(n,!0),(h.innerHTML&&null==g.innerHTML||h.textContent&&null==g.textContent)&&d(u,""),f?V(e.dynamicChildren,f,u,n,l,lU(t,r),i):s||Z(e,t,u,null,n,l,lU(t,r),i,!1),c>0){if(16&c)B(u,h,g,n,r);else if(2&c&&h.class!==g.class&&o(u,"class",null,g.class,r),4&c&&o(u,"style",h.style,g.style,r),8&c){let e=t.dynamicProps;for(let t=0;t{a&&rd(a,n,t,e),p&&tX(t,e,n,"updated")},l)},V=(e,t,n,l,r,i,s)=>{for(let o=0;o{if(t!==n){if(t!==_)for(let i in t)L(i)||i in n||o(e,i,t[i],null,r,l);for(let i in n){if(L(i))continue;let s=n[i],a=t[i];s!==a&&"value"!==i&&o(e,i,a,s,r,l)}"value"in n&&o(e,"value",t.value,n.value,r)}},$=(e,t,n,l,r,s,o,a,u)=>{let f=t.el=e?e.el:c(""),p=t.anchor=e?e.anchor:c(""),{patchFlag:d,dynamicChildren:h,slotScopeIds:g}=t;g&&(a=a?a.concat(g):g),null==e?(i(f,n,l),i(p,n,l),F(t.children||[],n,p,r,s,o,a,u)):d>0&&64&d&&h&&e.dynamicChildren&&e.dynamicChildren.length===h.length?(V(e.dynamicChildren,h,n,r,s,o,a),(null!=t.key||r&&t===r.subTree)&&lH(e,t,!0)):Z(e,t,n,p,r,s,o,a,u)},H=(e,t,n,l,r,i,s,o,a)=>{t.slotScopeIds=o,null==e?512&t.shapeFlag?r.ctx.activate(t,n,l,s,a):z(t,n,l,r,i,s,a):q(e,t,a)},z=(e,t,n,l,r,i,s)=>{var o,a,c;let f,p,d,h=(o=e,a=l,c=r,f=o.type,p=(a?a.appContext:o.appContext)||rh,(d={uid:rg++,vnode:o,type:f,parent:a,appContext:p,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new ea(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:a?a.provides:Object.create(p.provides),ids:a?a.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:function e(t,n,l=!1){let r=l?lO:n.propsCache,i=r.get(t);if(i)return i;let s=t.props,o={},a=[],u=!1;if(!A(t)){let r=t=>{u=!0;let[l,r]=e(t,n,!0);x(o,l),r&&a.push(...r)};!l&&n.mixins.length&&n.mixins.forEach(r),t.extends&&r(t.extends),t.mixins&&t.mixins.forEach(r)}if(!s&&!u)return N(t)&&r.set(t,m),m;if(T(s))for(let e=0;e{let l=e(t,n,!0);l&&(a=!0,x(o,l))};!l&&n.mixins.length&&n.mixins.forEach(r),t.extends&&r(t.extends),t.mixins&&t.mixins.forEach(r)}return s||a?(T(s)?s.forEach(e=>o[e]=null):x(o,s),N(t)&&r.set(t,o),o):(N(t)&&r.set(t,null),null)}(f,p),emit:null,emitted:null,propsDefaults:_,inheritAttrs:f.inheritAttrs,ctx:_,data:_,props:_,attrs:_,slots:_,refs:_,setupState:_,setupContext:null,suspense:c,suspenseId:c?c.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null}).ctx={_:d},d.root=a?a.root:d,d.emit=lv.bind(null,d),o.ce&&o.ce(d),e.component=d);if(nF(e)&&(h.ctx.renderer=ef),function(e,t=!1,n=!1){t&&u(t);let{props:l,children:r}=e.vnode,i=rb(e);!function(e,t,n,l=!1){let r={},i=Object.create(lk);for(let n in e.propsDefaults=Object.create(null),lT(e,t,r,i),e.propsOptions[0])n in r||(r[n]=void 0);n?e.props=l?r:tt(r):e.type.props?e.props=r:e.props=i,e.attrs=i}(e,l,i,t);var s=n||t;let o=e.slots=Object.create(lk);if(32&e.vnode.shapeFlag){let e=r._;e?(lF(o,r,s),s&&K(o,"_",e,!0)):lI(r,o)}else r&&lL(e,r);i&&function(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,n9);let{setup:l}=n;if(l){eS();let n=e.setupContext=l.length>1?rk(e):null,r=rm(e),i=tO(l,e,0,[e.props,n]),s=P(i);if(eC(),r(),(s||e.sp)&&!nI(e)&&ny(e),s){if(i.then(ry,ry),t)return i.then(n=>{rC(e,n,t)}).catch(t=>{tN(t,e,0)});e.asyncDep=i}else rC(e,i,t)}else rx(e,t)}(e,t),t&&u(!1)}(h,!1,s),h.asyncDep){if(r&&r.registerDep(h,J,s),!e.el){let l=h.subTree=ri(l0);k(null,l,t,n),e.placeholder=l.el}}else J(h,e,t,n,r,i,s)},q=(e,t,n)=>{let l=t.component=e.component;if(function(e,t,n){let{props:l,children:r,component:i}=e,{props:s,children:o,patchFlag:a}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!n||!(a>=0))return(!!r||!!o)&&(!o||!o.$stable)||l!==s&&(l?!s||lC(l,s,u):!!s);if(1024&a)return!0;if(16&a)return l?lC(l,s,u):!!s;if(8&a){let e=t.dynamicProps;for(let t=0;t{e.scope.on();let a=e.effect=new ec(()=>{if(e.isMounted){let t,{next:n,bu:l,u:r,parent:a,vnode:c}=e;{let t=function e(t){let n=t.subTree.component;if(n)if(n.asyncDep&&!n.asyncResolved)return n;else return e(n)}(e);if(t){n&&(n.el=c.el,X(e,n,o)),t.asyncDep.then(()=>{lj(()=>{e.isUnmounted||u()},i)});return}}let f=n;lB(e,!1),n?(n.el=c.el,X(e,n,o)):n=c,l&&W(l),(t=n.props&&n.props.onVnodeBeforeUpdate)&&rd(t,a,n,c),lB(e,!0);let p=ly(e),d=e.subTree;e.subTree=p,C(d,p,h(d.el),es(d),e,i,s),n.el=p.el,null===f&&lw(e,p.el),r&&lj(r,i),(t=n.props&&n.props.onVnodeUpdated)&&lj(()=>rd(t,a,n,c),i)}else{let o,{el:a,props:u}=t,{bm:c,m:f,parent:p,root:d,type:h}=e,g=nI(t);if(lB(e,!1),c&&W(c),!g&&(o=u&&u.onVnodeBeforeMount)&&rd(o,p,t),lB(e,!0),a&&r){let t=()=>{e.subTree=ly(e),r(a,e.subTree,e,i,null)};g&&h.__asyncHydrate?h.__asyncHydrate(a,e,t):t()}else{d.ce&&d.ce._hasShadowRoot()&&d.ce._injectChildStyle(h,e.parent?e.parent.type:void 0);let r=e.subTree=ly(e);C(null,r,n,l,e,i,s),t.el=r.el}if(f&&lj(f,i),!g&&(o=u&&u.onVnodeMounted)){let e=t;lj(()=>rd(o,p,e),i)}(256&t.shapeFlag||p&&nI(p.vnode)&&256&p.vnode.shapeFlag)&&e.a&&lj(e.a,i),e.isMounted=!0,t=n=l=null}});e.scope.off();let u=e.update=a.run.bind(a),c=e.job=a.runIfDirty.bind(a);c.i=e,c.id=e.uid,a.scheduler=()=>tU(c),lB(e,!0),u()},X=(e,t,n)=>{t.component=e;let l=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,l){let{props:r,attrs:i,vnode:{patchFlag:s}}=e,o=ta(r),[a]=e.propsOptions,u=!1;if((l||s>0)&&!(16&s)){if(8&s){let n=e.vnode.dynamicProps;for(let l=0;l{let{vnode:l,slots:r}=e,i=!0,s=_;if(32&l.shapeFlag){let e=t._;e?n&&1===e?i=!1:lF(r,t,n):(i=!t.$stable,lI(t,r)),s=t}else t&&(lL(e,t),s={default:1});if(i)for(let e in r)lN(e)||null!=s[e]||delete r[e]})(e,t.children,n),eS(),tH(e),eC()},Z=(e,t,n,l,r,i,s,o,a=!1)=>{let u=e&&e.children,c=e?e.shapeFlag:0,f=t.children,{patchFlag:p,shapeFlag:h}=t;if(p>0){if(128&p)return void Q(u,f,n,l,r,i,s,o,a);else if(256&p)return void Y(u,f,n,l,r,i,s,o,a)}8&h?(16&c&&ei(u,r,i),f!==u&&d(n,f)):16&c?16&h?Q(u,f,n,l,r,i,s,o,a):ei(u,r,i,!0):(8&c&&d(n,""),16&h&&F(f,n,l,r,i,s,o,a))},Y=(e,t,n,l,r,i,s,o,a)=>{let u;e=e||m,t=t||m;let c=e.length,f=t.length,p=Math.min(c,f);for(u=0;uf?ei(e,r,i,!0,!1,p):F(t,n,l,r,i,s,o,a,p)},Q=(e,t,n,l,r,i,s,o,a)=>{let u=0,c=t.length,f=e.length-1,p=c-1;for(;u<=f&&u<=p;){let l=e[u],c=t[u]=a?rc(t[u]):ru(t[u]);if(rt(l,c))C(l,c,n,null,r,i,s,o,a);else break;u++}for(;u<=f&&u<=p;){let l=e[f],u=t[p]=a?rc(t[p]):ru(t[p]);if(rt(l,u))C(l,u,n,null,r,i,s,o,a);else break;f--,p--}if(u>f){if(u<=p){let e=p+1,f=ep)for(;u<=f;)et(e[u],r,i,!0),u++;else{let d,h=u,g=u,_=new Map;for(u=g;u<=p;u++){let e=t[u]=a?rc(t[u]):ru(t[u]);null!=e.key&&_.set(e.key,u)}let y=0,b=p-g+1,S=!1,x=0,w=Array(b);for(u=0;u=b){et(c,r,i,!0);continue}if(null!=c.key)l=_.get(c.key);else for(d=g;d<=p;d++)if(0===w[d-g]&&rt(c,t[d])){l=d;break}void 0===l?et(c,r,i,!0):(w[l-g]=u+1,l>=x?x=l:S=!0,C(c,t[l],n,null,r,i,s,o,a),y++)}let k=S?function(e){let t,n,l,r,i,s=e.slice(),o=[0],a=e.length;for(t=0;t>1]]0&&(s[t]=o[l-1]),o[l]=t)}}for(l=o.length,r=o[l-1];l-- >0;)o[l]=r,r=s[r];return o}(w):m;for(d=k.length-1,u=b-1;u>=0;u--){let e=g+u,f=t[e],p=t[e+1],h=e+1{let{el:o,type:a,transition:u,children:c,shapeFlag:f}=e;if(6&f)return void ee(e.component.subTree,t,n,l);if(128&f)return void e.suspense.move(t,n,l);if(64&f)return void a.move(e,t,n,ef);if(a===lY){i(o,t,n);for(let e=0;e{let r;for(;e&&e!==t;)r=g(e),i(e,n,l),e=r;i(t,n,l)})(e,t,n);if(2!==l&&1&f&&u)if(0===l)u.beforeEnter(o),i(o,t,n),lj(()=>u.enter(o),r);else{let{leave:l,delayLeave:r,afterLeave:a}=u,c=()=>{e.ctx.isUnmounted?s(o):i(o,t,n)},f=()=>{o._isLeaving&&o[nr](!0),l(o,()=>{c(),a&&a()})};r?r(o,c,f):f()}else i(o,t,n)},et=(e,t,n,l=!1,r=!1)=>{let i,{type:s,props:o,ref:a,children:u,dynamicChildren:c,shapeFlag:f,patchFlag:p,dirs:d,cacheIndex:h}=e;if(-2===p&&(r=!1),null!=a&&(eS(),nC(a,null,n,e,!0),eC()),null!=h&&(t.renderCache[h]=void 0),256&f)return void t.ctx.deactivate(e);let g=1&f&&d,_=!nI(e);if(_&&(i=o&&o.onVnodeBeforeUnmount)&&rd(i,t,e),6&f)er(e.component,n,l);else{if(128&f)return void e.suspense.unmount(n,l);g&&tX(e,null,t,"beforeUnmount"),64&f?e.type.remove(e,t,n,ef,l):c&&!c.hasOnce&&(s!==lY||p>0&&64&p)?ei(c,t,n,!1,!0):(s===lY&&384&p||!r&&16&f)&&ei(u,t,n),l&&en(e)}(_&&(i=o&&o.onVnodeUnmounted)||g)&&lj(()=>{i&&rd(i,t,e),g&&tX(e,null,t,"unmounted")},n)},en=e=>{let{type:t,el:n,anchor:l,transition:r}=e;if(t===lY)return void el(n,l);if(t===l1)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=g(e),s(e),e=n;s(t)})(e);let i=()=>{s(n),r&&!r.persisted&&r.afterLeave&&r.afterLeave()};if(1&e.shapeFlag&&r&&!r.persisted){let{leave:t,delayLeave:l}=r,s=()=>t(n,i);l?l(e.el,i,s):s()}else i()},el=(e,t)=>{let n;for(;e!==t;)n=g(e),s(e),e=n;s(t)},er=(e,t,n)=>{let{bum:l,scope:r,job:i,subTree:s,um:o,m:a,a:u}=e;lW(a),lW(u),l&&W(l),r.stop(),i&&(i.flags|=8,et(s,e,t,n)),o&&lj(o,t),lj(()=>{e.isUnmounted=!0},t)},ei=(e,t,n,l=!1,r=!1,i=0)=>{for(let s=i;s{if(6&e.shapeFlag)return es(e.component.subTree);if(128&e.shapeFlag)return e.suspense.next();let t=g(e.anchor||e.el),n=t&&t[t8];return n?g(n):t},eo=!1,eu=(e,t,n)=>{let l;null==e?t._vnode&&(et(t._vnode,null,null,!0),l=t._vnode.component):C(t._vnode||null,e,t,null,null,null,n),t._vnode=e,eo||(eo=!0,tH(l),tW(),eo=!1)},ef={p:C,um:et,m:ee,r:en,mt:z,mc:F,pc:Z,pbc:V,n:es,o:e};return t&&([l,r]=t(ef)),{render:eu,hydrate:l,createApp:(n=l,function(e,t=null){A(e)||(e=x({},e)),null==t||N(t)||(t=null);let l=lp(),r=new WeakSet,i=[],s=!1,o=l.app={_uid:ld++,_component:e,_props:t,_container:null,_context:l,_instance:null,version:rN,get config(){return l.config},set config(v){},use:(e,...t)=>(r.has(e)||(e&&A(e.install)?(r.add(e),e.install(o,...t)):A(e)&&(r.add(e),e(o,...t))),o),mixin:e=>(l.mixins.includes(e)||l.mixins.push(e),o),component:(e,t)=>t?(l.components[e]=t,o):l.components[e],directive:(e,t)=>t?(l.directives[e]=t,o):l.directives[e],mount(r,i,a){if(!s){let u=o._ceVNode||ri(e,t);return u.appContext=l,!0===a?a="svg":!1===a&&(a=void 0),i&&n?n(u,r):eu(u,r,a),s=!0,o._container=r,r.__vue_app__=o,rE(u.component)}},onUnmount(e){i.push(e)},unmount(){s&&(tR(i,o._instance,16),eu(null,o._container),delete o._container.__vue_app__)},provide:(e,t)=>(l.provides[e]=t,o),runWithContext(e){let t=lh;lh=o;try{return e()}finally{lh=t}}};return o})}}function lU({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function lB({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function l$(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function lH(e,t,n=!1){let l=e.children,r=t.children;if(T(l)&&T(r))for(let e=0;ee.__isSuspense,lz=0;function lq(e,t){let n=e.props&&e.props[t];A(n)&&n()}function lG(e,t,n,l,r,i,s,o,a,u,c=!1){var f;let p,d,{p:h,m:g,um:_,n:m,o:{parentNode:y,remove:b}}=u,S=null!=(p=(f=e).props&&f.props.suspensible)&&!1!==p;S&&t&&t.pendingBranch&&(d=t.pendingId,t.deps++);let C=e.props?q(e.props.timeout):void 0,x=i,w={vnode:e,parent:t,parentComponent:n,namespace:s,container:l,hiddenContainer:r,deps:0,pendingId:lz++,timeout:"number"==typeof C?C:-1,activeBranch:null,pendingBranch:null,isInFallback:!c,isHydrating:c,isUnmounted:!1,effects:[],resolve(e=!1,n=!1){let{vnode:l,activeBranch:r,pendingBranch:s,pendingId:o,effects:a,parentComponent:u,container:c,isInFallback:f}=w,p=!1;w.isHydrating?w.isHydrating=!1:!e&&((p=r&&s.transition&&"out-in"===s.transition.mode)&&(r.transition.afterLeave=()=>{o===w.pendingId&&(g(s,c,i===x?m(r):i,0),t$(a),f&&l.ssFallback&&(l.ssFallback.el=null))}),r&&(y(r.el)===c&&(i=m(r)),_(r,u,w,!0),!p&&f&&l.ssFallback&&lj(()=>l.ssFallback.el=null,w)),p||g(s,c,i,0)),lZ(w,s),w.pendingBranch=null,w.isInFallback=!1;let h=w.parent,b=!1;for(;h;){if(h.pendingBranch){h.effects.push(...a),b=!0;break}h=h.parent}b||p||t$(a),w.effects=[],S&&t&&t.pendingBranch&&d===t.pendingId&&(t.deps--,0!==t.deps||n||t.resolve()),lq(l,"onResolve")},fallback(e){if(!w.pendingBranch)return;let{vnode:t,activeBranch:n,parentComponent:l,container:r,namespace:i}=w;lq(t,"onFallback");let s=m(n),u=()=>{w.isInFallback&&(h(null,e,r,s,l,null,i,o,a),lZ(w,e))},c=e.transition&&"out-in"===e.transition.mode;c&&(n.transition.afterLeave=u),w.isInFallback=!0,_(n,l,null,!0),c||u()},move(e,t,n){w.activeBranch&&g(w.activeBranch,e,t,n),w.container=e},next:()=>w.activeBranch&&m(w.activeBranch),registerDep(e,t,n){let l=!!w.pendingBranch;l&&w.deps++;let r=e.vnode.el;e.asyncDep.catch(t=>{tN(t,e,0)}).then(i=>{if(e.isUnmounted||w.isUnmounted||w.pendingId!==e.suspenseId)return;e.asyncResolved=!0;let{vnode:o}=e;rC(e,i,!1),r&&(o.el=r);let a=!r&&e.subTree.el;t(e,o,y(r||e.subTree.el),r?null:m(e.subTree),w,s,n),a&&(o.placeholder=null,b(a)),lw(e,o.el),l&&0==--w.deps&&w.resolve()})},unmount(e,t){w.isUnmounted=!0,w.activeBranch&&_(w.activeBranch,n,e,t),w.pendingBranch&&_(w.pendingBranch,n,e,t)}};return w}function lJ(e){let t;if(A(e)){let n=l3&&e._c;n&&(e._d=!1,l8()),e=e(),n&&(e._d=!0,t=l6,l4())}return T(e)&&(e=function(e){let t;for(let n=0;nt!==e)),e}function lX(e,t){t&&t.pendingBranch?T(e)?t.effects.push(...e):t.effects.push(e):t$(e)}function lZ(e,t){e.activeBranch=t;let{vnode:n,parentComponent:l}=e,r=t.el;for(;!r&&t.component;)r=(t=t.component.subTree).el;n.el=r,l&&l.subTree===n&&(l.vnode.el=r,lw(l,r))}let lY=Symbol.for("v-fgt"),lQ=Symbol.for("v-txt"),l0=Symbol.for("v-cmt"),l1=Symbol.for("v-stc"),l2=[],l6=null;function l8(e=!1){l2.push(l6=e?null:[])}function l4(){l2.pop(),l6=l2[l2.length-1]||null}let l3=1;function l5(e,t=!1){l3+=e,e<0&&l6&&t&&(l6.hasOnce=!0)}function l9(e){return e.dynamicChildren=l3>0?l6||m:null,l4(),l3>0&&l6&&l6.push(e),e}function l7(e,t,n,l,r){return l9(ri(e,t,n,l,r,!0))}function re(e){return!!e&&!0===e.__v_isVNode}function rt(e,t){return e.type===t.type&&e.key===t.key}let rn=({key:e})=>null!=e?e:null,rl=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?O(e)||tp(e)||A(e)?{i:tz,r:e,k:t,f:!!n}:e:null);function rr(e,t=null,n=null,l=0,r=null,i=+(e!==lY),s=!1,o=!1){let a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&rn(t),ref:t&&rl(t),scopeId:tq,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:l,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:tz};return o?(rf(a,n),128&i&&e.normalize(a)):n&&(a.shapeFlag|=O(n)?8:16),l3>0&&!s&&l6&&(a.patchFlag>0||6&i)&&32!==a.patchFlag&&l6.push(a),a}let ri=function(e,t=null,n=null,l=0,r=null,i=!1){var s;if(e&&e!==n2||(e=l0),re(e)){let l=ro(e,t,!0);return n&&rf(l,n),l3>0&&!i&&l6&&(6&l.shapeFlag?l6[l6.indexOf(e)]=l:l6.push(l)),l.patchFlag=-2,l}if(A(s=e)&&"__vccOpts"in s&&(e=e.__vccOpts),t){let{class:e,style:n}=t=rs(t);e&&!O(e)&&(t.class=ee(e)),N(n)&&(to(n)&&!T(n)&&(n=x({},n)),t.style=X(n))}let o=O(e)?1:lK(e)?128:e.__isTeleport?64:N(e)?4:2*!!A(e);return rr(e,t,n,l,r,o,i,!0)};function rs(e){return e?to(e)||lE(e)?x({},e):e:null}function ro(e,t,n=!1,l=!1){let{props:r,ref:i,patchFlag:s,children:o,transition:a}=e,u=t?rp(r||{},t):r,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&rn(u),ref:t&&t.ref?n&&i?T(i)?i.concat(rl(t)):[i,rl(t)]:rl(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==lY?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ro(e.ssContent),ssFallback:e.ssFallback&&ro(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&l&&nv(c,a.clone(c)),c}function ra(e=" ",t=0){return ri(lQ,null,e,t)}function ru(e){return null==e||"boolean"==typeof e?ri(l0):T(e)?ri(lY,null,e.slice()):re(e)?rc(e):ri(lQ,null,String(e))}function rc(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:ro(e)}function rf(e,t){let n=0,{shapeFlag:l}=e;if(null==t)t=null;else if(T(t))n=16;else if("object"==typeof t)if(65&l){let n=t.default;n&&(n._c&&(n._d=!1),rf(e,n()),n._c&&(n._d=!0));return}else{n=32;let l=t._;l||lE(t)?3===l&&tz&&(1===tz.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=tz}else A(t)?(t={default:t,_ctx:tz},n=32):(t=String(t),64&l?(n=16,t=[ra(t)]):n=8);e.children=t,e.shapeFlag|=n}function rp(...e){let t={};for(let n=0;nrv||tz;a=e=>{rv=e},u=e=>{rS=e};let rm=e=>{let t=rv;return a(e),e.scope.on(),()=>{e.scope.off(),a(t)}},ry=()=>{rv&&rv.scope.off(),a(null)};function rb(e){return 4&e.vnode.shapeFlag}let rS=!1;function rC(e,t,n){A(t)?e.render=t:N(t)&&(e.setupState=ty(t)),rx(e,n)}function rx(e,t,n){let l=e.type;if(!e.render){if(!t&&c&&!l.render){let t=l.template||lr(e).template;if(t){let{isCustomElement:n,compilerOptions:r}=e.appContext.config,{delimiters:i,compilerOptions:s}=l,o=x(x({isCustomElement:n,delimiters:i},r),s);l.render=c(t,o)}}e.render=l.render||y,f&&f(e)}{let t=rm(e);eS();try{!function(e){let t=lr(e),n=e.proxy,l=e.ctx;ln=!1,t.beforeCreate&&ll(t.beforeCreate,e,"bc");let{data:r,computed:i,methods:s,watch:o,provide:a,inject:u,created:c,beforeMount:f,mounted:p,beforeUpdate:d,updated:h,activated:g,deactivated:_,beforeUnmount:m,unmounted:b,render:S,renderTracked:C,renderTriggered:x,errorCaptured:w,serverPrefetch:k,expose:E,inheritAttrs:R,components:P,directives:M}=t;if(u&&function(e,t){for(let n in T(e)&&(e=la(e)),e){let l,r=e[n];tp(l=N(r)?"default"in r?tY(r.from||n,r.default,!0):tY(r.from||n):tY(r))?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e}):t[n]=l}}(u,l),s)for(let e in s){let t=s[e];A(t)&&(l[e]=t.bind(n))}if(r){let t=r.call(n,n);N(t)&&(e.data=te(t))}if(ln=!0,i)for(let e in i){let t=i[e],r=A(t)?t.bind(n,n):A(t.get)?t.get.bind(n,n):y,s=rA({get:r,set:!A(t)&&A(t.set)?t.set.bind(n):y});Object.defineProperty(l,e,{enumerable:!0,configurable:!0,get:()=>s.value,set:e=>s.value=e})}if(o)for(let e in o)!function e(t,n,l,r){let i=r.includes(".")?t6(l,r):()=>l[r];if(O(t)){let e=n[t];A(e)&&t1(i,e,void 0)}else if(A(t))t1(i,t.bind(l),void 0);else if(N(t))if(T(t))t.forEach(t=>e(t,n,l,r));else{let e=A(t.handler)?t.handler.bind(l):n[t.handler];A(e)&&t1(i,e,t)}}(o[e],l,n,e);if(a){let e=A(a)?a.call(n):a;Reflect.ownKeys(e).forEach(t=>{tZ(t,e[t])})}function I(e,t){T(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(c&&ll(c,e,"c"),I(nK,f),I(nz,p),I(nq,d),I(nG,h),I(nD,g),I(nV,_),I(n0,w),I(nQ,C),I(nY,x),I(nJ,m),I(nX,b),I(nZ,k),T(E))if(E.length){let t=e.exposed||(e.exposed={});E.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||(e.exposed={});S&&e.render===y&&(e.render=S),null!=R&&(e.inheritAttrs=R),P&&(e.components=P),M&&(e.directives=M)}(e)}finally{eC(),t()}}}let rw={get:(e,t)=>(eN(e,"get",""),e[t])};function rk(e){return{attrs:new Proxy(e.attrs,rw),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function rE(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(ty(tu(e.exposed)),{get:(t,n)=>n in t?t[n]:n in n3?n3[n](e):void 0,has:(e,t)=>t in e||t in n3})):e.proxy}function rT(e,t=!0){return A(e)?e.displayName||e.name:e.name||t&&e.__name}let rA=(e,t)=>(function(e,t=!1){let n,l;return A(e)?n=e:(n=e.get,l=e.set),new tw(n,l,t)})(e,rS);function rO(e,t,n){try{l5(-1);let l=arguments.length;if(2!==l)return l>3?n=Array.prototype.slice.call(arguments,2):3===l&&re(n)&&(n=[n]),ri(e,t,n);if(!N(t)||T(t))return ri(e,null,t);if(re(t))return ri(e,null,[t]);return ri(e,t)}finally{l5(1)}}function rR(e,t){let n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e0&&l6&&l6.push(e),!0}let rN="3.5.30",rP="u">typeof window&&window.trustedTypes;if(rP)try{h=rP.createPolicy("vue",{createHTML:e=>e})}catch(e){}let rM=h?e=>h.createHTML(e):e=>e,rI="u">typeof document?document:null,rL=rI&&rI.createElement("template"),rF={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,l)=>{let r="svg"===t?rI.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?rI.createElementNS("http://www.w3.org/1998/Math/MathML",e):n?rI.createElement(e,{is:n}):rI.createElement(e);return"select"===e&&l&&null!=l.multiple&&r.setAttribute("multiple",l.multiple),r},createText:e=>rI.createTextNode(e),createComment:e=>rI.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>rI.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,l,r,i){let s=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),r!==i&&(r=r.nextSibling););else{rL.innerHTML=rM("svg"===l?`${e}`:"mathml"===l?`${e}`:e);let r=rL.content;if("svg"===l||"mathml"===l){let e=r.firstChild;for(;e.firstChild;)r.appendChild(e.firstChild);r.removeChild(e)}t.insertBefore(r,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},rj="transition",rD="animation",rV=Symbol("_vtc"),rU={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},rB=x({},na,rU),r$=((t=(e,{slots:t})=>rO(nf,rK(e),t)).displayName="Transition",t.props=rB,t),rH=(e,t=[])=>{T(e)?e.forEach(e=>e(...t)):e&&e(...t)},rW=e=>!!e&&(T(e)?e.some(e=>e.length>1):e.length>1);function rK(e){let t={};for(let n in e)n in rU||(t[n]=e[n]);if(!1===e.css)return t;let{name:n="v",type:l,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:o=`${n}-enter-to`,appearFromClass:a=i,appearActiveClass:u=s,appearToClass:c=o,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:d=`${n}-leave-to`}=e,h=function(e){if(null==e)return null;{if(N(e))return[function(e){return q(e)}(e.enter),function(e){return q(e)}(e.leave)];let t=function(e){return q(e)}(e);return[t,t]}}(r),g=h&&h[0],_=h&&h[1],{onBeforeEnter:m,onEnter:y,onEnterCancelled:b,onLeave:S,onLeaveCancelled:C,onBeforeAppear:w=m,onAppear:k=y,onAppearCancelled:E=b}=t,T=(e,t,n,l)=>{e._enterCancelled=l,rq(e,t?c:o),rq(e,t?u:s),n&&n()},A=(e,t)=>{e._isLeaving=!1,rq(e,f),rq(e,d),rq(e,p),t&&t()},O=e=>(t,n)=>{let r=e?k:y,s=()=>T(t,e,n);rH(r,[t,s]),rG(()=>{rq(t,e?a:i),rz(t,e?c:o),rW(r)||rX(t,l,g,s)})};return x(t,{onBeforeEnter(e){rH(m,[e]),rz(e,i),rz(e,s)},onBeforeAppear(e){rH(w,[e]),rz(e,a),rz(e,u)},onEnter:O(!1),onAppear:O(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>A(e,t);rz(e,f),e._enterCancelled?(rz(e,p),r0(e)):(r0(e),rz(e,p)),rG(()=>{e._isLeaving&&(rq(e,f),rz(e,d),rW(S)||rX(e,l,_,n))}),rH(S,[e,n])},onEnterCancelled(e){T(e,!1,void 0,!0),rH(b,[e])},onAppearCancelled(e){T(e,!0,void 0,!0),rH(E,[e])},onLeaveCancelled(e){A(e),rH(C,[e])}})}function rz(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[rV]||(e[rV]=new Set)).add(t)}function rq(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[rV];n&&(n.delete(t),n.size||(e[rV]=void 0))}function rG(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let rJ=0;function rX(e,t,n,l){let r=e._endId=++rJ,i=()=>{r===e._endId&&l()};if(null!=n)return setTimeout(i,n);let{type:s,timeout:o,propCount:a}=rZ(e,t);if(!s)return l();let u=s+"end",c=0,f=()=>{e.removeEventListener(u,p),i()},p=t=>{t.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[e]||"").split(", "),r=l(`${rj}Delay`),i=l(`${rj}Duration`),s=rY(r,i),o=l(`${rD}Delay`),a=l(`${rD}Duration`),u=rY(o,a),c=null,f=0,p=0;t===rj?s>0&&(c=rj,f=s,p=i.length):t===rD?u>0&&(c=rD,f=u,p=a.length):p=(c=(f=Math.max(s,u))>0?s>u?rj:rD:null)?c===rj?i.length:a.length:0;let d=c===rj&&/\b(?:transform|all)(?:,|$)/.test(l(`${rj}Property`).toString());return{type:c,timeout:f,propCount:p,hasTransform:d}}function rY(e,t){for(;e.lengthrQ(t)+rQ(e[n])))}function rQ(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}function r0(e){return(e?e.ownerDocument:document).body.offsetHeight}let r1=Symbol("_vod"),r2=Symbol("_vsh");function r6(e,t){e.style.display=t?e[r1]:"none",e[r2]=!t}let r8=Symbol("");function r4(e,t){if(1===e.nodeType){let l=e.style,r="";for(let e in t){var n;let i=null==(n=t[e])?"initial":"string"==typeof n?""===n?" ":n:String(n);l.setProperty(`--${e}`,i),r+=`--${e}: ${i};`}l[r8]=r}}let r3=/(?:^|;)\s*display\s*:/,r5=/\s*!important$/;function r9(e,t,n){if(T(n))n.forEach(n=>r9(e,t,n));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{let l=function(e,t){let n=ie[t];if(n)return n;let l=D(t);if("filter"!==l&&l in e)return ie[t]=l;l=B(l);for(let n=0;n111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&123>e.charCodeAt(2),ip=(e,t,n,l,r,i)=>{let s="svg"===r;if("class"===t){var o;let t;o=l,(t=e[rV])&&(o=(o?[o,...t]:[...t]).join(" ")),null==o?e.removeAttribute("class"):s?e.setAttribute("class",o):e.className=o}else"style"===t?function(e,t,n){let l=e.style,r=O(n),i=!1;if(n&&!r){if(t)if(O(t))for(let e of t.split(";")){let t=e.slice(0,e.indexOf(":")).trim();null==n[t]&&r9(l,t,"")}else for(let e in t)null==n[e]&&r9(l,e,"");for(let e in n)"display"===e&&(i=!0),r9(l,e,n[e])}else if(r){if(t!==n){let e=l[r8];e&&(n+=";"+e),l.cssText=n,i=r3.test(n)}}else t&&e.removeAttribute("style");r1 in e&&(e[r1]=i?l.display:"",e[r2]&&(l.display="none"))}(e,n,l):S(t)?C(t)||function(e,t,n,l=null){let r=e[is]||(e[is]={}),i=r[t];if(n&&i)i.value=n;else{let[a,u]=function(e){let t;if(io.test(e)){let n;for(t={};n=e.match(io);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[":"===e[2]?e.slice(3):U(e.slice(2)),t]}(t);if(n){var s,o;let i;ii(e,a,r[t]=(s=n,o=l,(i=e=>{if(e._vts){if(e._vts<=i.attached)return}else e._vts=Date.now();tR(function(e,t){if(!T(t))return t;{let n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(e=>t=>!t._stopped&&e&&e(t))}}(e,i.value),o,5,[e])}).value=s,i.attached=ia||(iu.then(()=>ia=0),ia=Date.now()),i),u)}else i&&(e.removeEventListener(a,i,u),r[t]=void 0)}}(e,t,l,i):("."===t[0]?(t=t.slice(1),0):"^"===t[0]?(t=t.slice(1),1):!function(e,t,n,l){if(l)return!!("innerHTML"===t||"textContent"===t||t in e&&ic(t)&&A(n));if("spellcheck"===t||"draggable"===t||"translate"===t||"autocorrect"===t||"sandbox"===t&&"IFRAME"===e.tagName||"form"===t||"list"===t&&"INPUT"===e.tagName||"type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){let t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}return!(ic(t)&&O(n))&&t in e}(e,t,l,s))?e._isVueCE&&(function(e,t){let n=e._def.props;if(!n)return!1;let l=D(t);return Array.isArray(n)?n.some(e=>D(e)===l):Object.keys(n).some(e=>D(e)===l)}(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!O(l)))?ir(e,D(t),l,i,t):("true-value"===t?e._trueValue=l:"false-value"===t&&(e._falseValue=l),il(e,t,l,s)):(ir(e,t,l),e.tagName.includes("-")||"value"!==t&&"checked"!==t&&"selected"!==t||il(e,t,l,s,i,"value"!==t))},id={};function ih(e,t,n){let l,r=nm(e,t);"[object Object]"===(l=r,M.call(l))&&(r=x({},r,t));class i extends iv{constructor(e){super(r,e,n)}}return i.def=r,i}let ig="u">typeof HTMLElement?HTMLElement:class{};class iv extends ig{constructor(e,t={},n=iG){super(),this._def=e,this._props=t,this._createApp=n,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._patching=!1,this._dirty=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._styleAnchors=new WeakMap,this._ob=null,this.shadowRoot&&n!==iG?this._root=this.shadowRoot:!1!==e.shadowRoot?(this.attachShadow(x({},e.shadowRootOptions,{mode:"open"})),this._root=this.shadowRoot):this._root=this}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._resolved||this._parseSlots(),this._connected=!0;let e=this;for(;e=e&&(e.assignedSlot||e.parentNode||e.host);)if(e instanceof iv){this._parent=e;break}this._instance||(this._resolved?this._mount(this._def):e&&e._pendingResolve?this._pendingResolve=e._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(e=this._parent){e&&(this._instance.parent=e._instance,this._inheritParentContext(e))}_inheritParentContext(e=this._parent){e&&this._app&&Object.setPrototypeOf(this._app._context.provides,e._instance.provides)}disconnectedCallback(){this._connected=!1,tV(()=>{!this._connected&&(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null,this._teleportTargets&&(this._teleportTargets.clear(),this._teleportTargets=void 0))})}_processMutations(e){for(let t of e)this._setAttr(t.attributeName)}_resolveDef(){if(this._pendingResolve)return;for(let e=0;e{let n;this._resolved=!0,this._pendingResolve=void 0;let{props:l,styles:r}=e;if(l&&!T(l))for(let e in l){let t=l[e];(t===Number||t&&t.type===Number)&&(e in this._props&&(this._props[e]=q(this._props[e])),(n||(n=Object.create(null)))[D(e)]=!0)}this._numberProps=n,this._resolveProps(e),this.shadowRoot&&this._applyStyles(r),this._mount(e)},t=this._def.__asyncLoader;t?this._pendingResolve=t().then(t=>{t.configureApp=this._def.configureApp,e(this._def=t,!0)}):e(this._def)}_mount(e){this._app=this._createApp(e),this._inheritParentContext(),e.configureApp&&e.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);let t=this._instance&&this._instance.exposed;if(t)for(let e in t)E(this,e)||Object.defineProperty(this,e,{get:()=>t_(t[e])})}_resolveProps(e){let{props:t}=e,n=T(t)?t:Object.keys(t||{});for(let e of Object.keys(this))"_"!==e[0]&&n.includes(e)&&this._setProp(e,this[e]);for(let e of n.map(D))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t,!0,!this._patching)}})}_setAttr(e){if(e.startsWith("data-v-"))return;let t=this.hasAttribute(e),n=t?this.getAttribute(e):id,l=D(e);t&&this._numberProps&&this._numberProps[l]&&(n=q(n)),this._setProp(l,n,!1,!0)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,l=!1){if(t!==this._props[e]&&(this._dirty=!0,t===id?delete this._props[e]:(this._props[e]=t,"key"===e&&this._app&&(this._app._ceVNode.key=t)),l&&this._instance&&this._update(),n)){let n=this._ob;n&&(this._processMutations(n.takeRecords()),n.disconnect()),!0===t?this.setAttribute(U(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute(U(e),t+""):t||this.removeAttribute(U(e)),n&&n.observe(this,{attributes:!0})}}_update(){let e=this._createVNode();this._app&&(e.appContext=this._app._context),iq(e,this._root)}_createVNode(){let e={};this.shadowRoot||(e.onVnodeMounted=e.onVnodeUpdated=this._renderSlots.bind(this));let t=ri(this._def,x(e,this._props));return this._instance||(t.ce=e=>{this._instance=e,e.ce=this,e.isCE=!0;let t=(e,t)=>{let n;this.dispatchEvent(new CustomEvent(e,"[object Object]"===(n=t[0],M.call(n))?x({detail:t},t[0]):{detail:t}))};e.emit=(e,...n)=>{t(e,n),U(e)!==e&&t(U(e),n)},this._setParent()}),t}_applyStyles(e,t,n){if(!e)return;if(t){if(t===this._def||this._styleChildren.has(t))return;this._styleChildren.add(t)}let l=this._nonce,r=this.shadowRoot,i=n?this._getStyleAnchor(n)||this._getStyleAnchor(this._def):this._getRootStyleInsertionAnchor(r),s=null;for(let o=e.length-1;o>=0;o--){let a=document.createElement("style");l&&a.setAttribute("nonce",l),a.textContent=e[o],r.insertBefore(a,s||i),s=a,0===o&&(n||this._styleAnchors.set(this._def,a),t&&this._styleAnchors.set(t,a))}}_getStyleAnchor(e){if(!e)return null;let t=this._styleAnchors.get(e);return t&&t.parentNode===this.shadowRoot?t:(t&&this._styleAnchors.delete(e),null)}_getRootStyleInsertionAnchor(e){for(let t=0;t{if(!n.length)return;let t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){let l=e.cloneNode(),r=e[rV];r&&r.forEach(e=>{e.split(/\s+/).forEach(e=>e&&l.classList.remove(e))}),n.split(/\s+/).forEach(e=>e&&l.classList.add(e)),l.style.display="none";let i=1===t.nodeType?t:t.parentNode;i.appendChild(l);let{hasTransform:s}=rZ(l);return i.removeChild(l),s}(n[0].el,r.vnode.el,t)){n=[];return}n.forEach(ix),n.forEach(iw);let l=n.filter(ik);r0(r.vnode.el),l.forEach(e=>{let n=e.el,l=n.style;rz(n,t),l.transform=l.webkitTransform=l.transitionDuration="";let r=n[ib]=e=>{(!e||e.target===n)&&(!e||e.propertyName.endsWith("transform"))&&(n.removeEventListener("transitionend",r),n[ib]=null,rq(n,t))};n.addEventListener("transitionend",r)}),n=[]}),()=>{let s=ta(e),o=rK(s),a=s.tag||lY;if(n=[],l)for(let e=0;eMath.abs(s-1)&&(s=1),.01>Math.abs(o-1)&&(o=1),n.transform=n.webkitTransform=`translate(${l/s}px,${r/o}px)`,n.transitionDuration="0s",e}}function iE(e){let t=e.getBoundingClientRect();return{left:t.left,top:t.top}}let iT=e=>{let t=e.props["onUpdate:modelValue"]||!1;return T(t)?e=>W(t,e):t};function iA(e){e.target.composing=!0}function iO(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}let iR=Symbol("_assign");function iN(e,t,n){return t&&(e=e.trim()),n&&(e=z(e)),e}let iP={created(e,{modifiers:{lazy:t,trim:n,number:l}},r){e[iR]=iT(r);let i=l||r.props&&"number"===r.props.type;ii(e,t?"change":"input",t=>{t.target.composing||e[iR](iN(e.value,n,i))}),(n||i)&&ii(e,"change",()=>{e.value=iN(e.value,n,i)}),t||(ii(e,"compositionstart",iA),ii(e,"compositionend",iO),ii(e,"change",iO))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:l,trim:r,number:i}},s){if(e[iR]=iT(s),e.composing)return;let o=(i||"number"===e.type)&&!/^0\d/.test(e.value)?z(e.value):e.value,a=null==t?"":t;if(o!==a){if(document.activeElement===e&&"range"!==e.type&&(l&&t===n||r&&e.value.trim()===a))return;e.value=a}}},iM={deep:!0,created(e,t,n){e[iR]=iT(n),ii(e,"change",()=>{let t=e._modelValue,n=iD(e),l=e.checked,r=e[iR];if(T(t)){let e=el(t,n),i=-1!==e;if(l&&!i)r(t.concat(n));else if(!l&&i){let n=[...t];n.splice(e,1),r(n)}}else{let i;if("[object Set]"===(i=t,M.call(i))){let e=new Set(t);l?e.add(n):e.delete(n),r(e)}else r(iV(e,l))}})},mounted:iI,beforeUpdate(e,t,n){e[iR]=iT(n),iI(e,t,n)}};function iI(e,{value:t,oldValue:n},l){let r;if(e._modelValue=t,T(t))r=el(t,l.props.value)>-1;else{let i;if("[object Set]"===(i=t,M.call(i)))r=t.has(l.props.value);else{if(t===n)return;r=en(t,iV(e,!0))}}e.checked!==r&&(e.checked=r)}let iL={created(e,{value:t},n){e.checked=en(t,n.props.value),e[iR]=iT(n),ii(e,"change",()=>{e[iR](iD(e))})},beforeUpdate(e,{value:t,oldValue:n},l){e[iR]=iT(l),t!==n&&(e.checked=en(t,l.props.value))}},iF={deep:!0,created(e,{value:t,modifiers:{number:n}},l){let r,i="[object Set]"===(r=t,M.call(r));ii(e,"change",()=>{let t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?z(iD(e)):iD(e));e[iR](e.multiple?i?new Set(t):t:t[0]),e._assigning=!0,tV(()=>{e._assigning=!1})}),e[iR]=iT(l)},mounted(e,{value:t}){ij(e,t)},beforeUpdate(e,t,n){e[iR]=iT(n)},updated(e,{value:t}){e._assigning||ij(e,t)}};function ij(e,t){let n,l=e.multiple,r=T(t);if(!l||r||"[object Set]"===(n=t,M.call(n))){for(let n=0,i=e.options.length;nString(e)===String(s)):i.selected=el(t,s)>-1}else i.selected=t.has(s);else if(en(iD(i),t)){e.selectedIndex!==n&&(e.selectedIndex=n);return}}l||-1===e.selectedIndex||(e.selectedIndex=-1)}}function iD(e){return"_value"in e?e._value:e.value}function iV(e,t){let n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}function iU(e,t,n,l,r){let i=function(e,t){switch(e){case"SELECT":return iF;case"TEXTAREA":return iP;default:switch(t){case"checkbox":return iM;case"radio":return iL;default:return iP}}}(e.tagName,n.props&&n.props.type)[r];i&&i(e,t,n,l)}let iB=["ctrl","shift","alt","meta"],i$={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>iB.some(n=>e[`${n}Key`]&&!t.includes(n))},iH={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},iW=x({patchProp:ip},rF),iK=!1;function iz(){return p=iK?p:lD(iW),iK=!0,p}let iq=(...e)=>{(p||(p=lV(iW))).render(...e)},iG=(...e)=>{let t=(p||(p=lV(iW))).createApp(...e),{mount:n}=t;return t.mount=e=>{let l=iZ(e);if(!l)return;let r=t._component;A(r)||r.render||r.template||(r.template=l.innerHTML),1===l.nodeType&&(l.textContent="");let i=n(l,!1,iX(l));return l instanceof Element&&(l.removeAttribute("v-cloak"),l.setAttribute("data-v-app","")),i},t},iJ=(...e)=>{let t=iz().createApp(...e),{mount:n}=t;return t.mount=e=>{let t=iZ(e);if(t)return n(t,!0,iX(t))},t};function iX(e){return e instanceof SVGElement?"svg":"function"==typeof MathMLElement&&e instanceof MathMLElement?"mathml":void 0}function iZ(e){return O(e)?document.querySelector(e):e}return e.BaseTransition=nf,e.BaseTransitionPropsValidators=na,e.Comment=l0,e.DeprecationTypes=null,e.EffectScope=ea,e.ErrorCodes={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},e.ErrorTypeStrings=null,e.Fragment=lY,e.KeepAlive={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){let n=r_(),l=n.ctx,r=new Map,i=new Set,s=null,o=n.suspense,{renderer:{p:a,m:u,um:c,o:{createElement:f}}}=l,p=f("div");function d(e){nB(e),c(e,n,o,!0)}function h(e){r.forEach((t,n)=>{let l=rT(nI(t)?t.type.__asyncResolved||{}:t.type);l&&!e(l)&&g(n)})}function g(e){let t=r.get(e);!t||s&&rt(t,s)?s&&nB(s):d(t),r.delete(e),i.delete(e)}l.activate=(e,t,n,l,r)=>{let i=e.component;u(e,t,n,0,o),a(i.vnode,e,t,n,i,o,l,e.slotScopeIds,r),lj(()=>{i.isDeactivated=!1,i.a&&W(i.a);let t=e.props&&e.props.onVnodeMounted;t&&rd(t,i.parent,e)},o)},l.deactivate=e=>{let t=e.component;lW(t.m),lW(t.a),u(e,p,null,1,o),lj(()=>{t.da&&W(t.da);let n=e.props&&e.props.onVnodeUnmounted;n&&rd(n,t.parent,e),t.isDeactivated=!0},o)},t1(()=>[e.include,e.exclude],([e,t])=>{e&&h(t=>nj(e,t)),t&&h(e=>!nj(t,e))},{flush:"post",deep:!0});let _=null,m=()=>{null!=_&&(lK(n.subTree.type)?lj(()=>{r.set(_,n$(n.subTree))},n.subTree.suspense):r.set(_,n$(n.subTree)))};return nz(m),nG(m),nJ(()=>{r.forEach(e=>{let{subTree:t,suspense:l}=n,r=n$(t);if(e.type===r.type&&e.key===r.key){nB(r);let e=r.component.da;e&&lj(e,l);return}d(e)})}),()=>{if(_=null,!t.default)return s=null;let n=t.default(),l=n[0];if(n.length>1)return s=null,n;if(!re(l)||!(4&l.shapeFlag)&&!(128&l.shapeFlag))return s=null,l;let o=n$(l);if(o.type===l0)return s=null,o;let a=o.type,u=rT(nI(o)?o.type.__asyncResolved||{}:a),{include:c,exclude:f,max:p}=e;if(c&&(!u||!nj(c,u))||f&&u&&nj(f,u))return o.shapeFlag&=-257,s=o,l;let d=null==o.key?a:o.key,h=r.get(d);return o.el&&(o=ro(o),128&l.shapeFlag&&(l.ssContent=o)),_=d,h?(o.el=h.el,o.component=h.component,o.transition&&nv(o,o.transition),o.shapeFlag|=512,i.delete(d),i.add(d)):(i.add(d),p&&i.size>parseInt(p,10)&&g(i.values().next().value)),o.shapeFlag|=256,s=o,lK(l.type)?l:o}}},e.ReactiveEffect=ec,e.Static=l1,e.Suspense={name:"Suspense",__isSuspense:!0,process(e,t,n,l,r,i,s,o,a,u){if(null==e)!function(e,t,n,l,r,i,s,o,a){let{p:u,o:{createElement:c}}=a,f=c("div"),p=e.suspense=lG(e,r,l,t,f,n,i,s,o,a);u(null,p.pendingBranch=e.ssContent,f,null,l,p,i,s),p.deps>0?(lq(e,"onPending"),lq(e,"onFallback"),u(null,e.ssFallback,t,n,l,null,i,s),lZ(p,e.ssFallback)):p.resolve(!1,!0)}(t,n,l,r,i,s,o,a,u);else{if(i&&i.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}!function(e,t,n,l,r,i,s,o,{p:a,um:u,o:{createElement:c}}){let f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;let p=t.ssContent,d=t.ssFallback,{activeBranch:h,pendingBranch:g,isInFallback:_,isHydrating:m}=f;if(g)f.pendingBranch=p,rt(g,p)?(a(g,p,f.hiddenContainer,null,r,f,i,s,o),f.deps<=0?f.resolve():_&&!m&&(a(h,d,n,l,r,null,i,s,o),lZ(f,d))):(f.pendingId=lz++,m?(f.isHydrating=!1,f.activeBranch=g):u(g,r,f),f.deps=0,f.effects.length=0,f.hiddenContainer=c("div"),_?(a(null,p,f.hiddenContainer,null,r,f,i,s,o),f.deps<=0?f.resolve():(a(h,d,n,l,r,null,i,s,o),lZ(f,d))):h&&rt(h,p)?(a(h,p,n,l,r,f,i,s,o),f.resolve(!0)):(a(null,p,f.hiddenContainer,null,r,f,i,s,o),f.deps<=0&&f.resolve()));else if(h&&rt(h,p))a(h,p,n,l,r,f,i,s,o),lZ(f,p);else if(lq(t,"onPending"),f.pendingBranch=p,512&p.shapeFlag?f.pendingId=p.component.suspenseId:f.pendingId=lz++,a(null,p,f.hiddenContainer,null,r,f,i,s,o),f.deps<=0)f.resolve();else{let{timeout:e,pendingId:t}=f;e>0?setTimeout(()=>{f.pendingId===t&&f.fallback(d)},e):0===e&&f.fallback(d)}}(e,t,n,l,r,s,o,a,u)}},hydrate:function(e,t,n,l,r,i,s,o,a){let u=t.suspense=lG(t,l,n,e.parentNode,document.createElement("div"),null,r,i,s,o,!0),c=a(e,u.pendingBranch=t.ssContent,n,u,i,s);return 0===u.deps&&u.resolve(!1,!0),c},normalize:function(e){let{shapeFlag:t,children:n}=e,l=32&t;e.ssContent=lJ(l?n.default:n),e.ssFallback=l?lJ(n.fallback):ri(l0)}},e.Teleport=ne,e.Text=lQ,e.TrackOpTypes={GET:"get",HAS:"has",ITERATE:"iterate"},e.Transition=r$,e.TransitionGroup=iC,e.TriggerOpTypes={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},e.VueElement=iv,e.assertNumber=function(e,t){},e.callWithAsyncErrorHandling=tR,e.callWithErrorHandling=tO,e.camelize=D,e.capitalize=B,e.cloneVNode=ro,e.compatUtils=null,e.compile=()=>{},e.computed=rA,e.createApp=iG,e.createBlock=l7,e.createCommentVNode=function(e="",t=!1){return t?(l8(),l7(l0,null,e)):ri(l0,null,e)},e.createElementBlock=function(e,t,n,l,r,i){return l9(rr(e,t,n,l,r,i,!0))},e.createElementVNode=rr,e.createHydrationRenderer=lD,e.createPropsRestProxy=function(e,t){let n={};for(let l in e)t.includes(l)||Object.defineProperty(n,l,{enumerable:!0,get:()=>e[l]});return n},e.createRenderer=function(e){return lV(e)},e.createSSRApp=iJ,e.createSlots=function(e,t){for(let n=0;n{let t=l.fn(...e);return t&&(t.key=l.key),t}:l.fn)}return e},e.createStaticVNode=function(e,t){let n=ri(l1,null,e);return n.staticCount=t,n},e.createTextVNode=ra,e.createVNode=ri,e.customRef=tS,e.defineAsyncComponent=function(e){let t;A(e)&&(e={loader:e});let{loader:n,loadingComponent:l,errorComponent:r,delay:i=200,hydrate:s,timeout:o,suspensible:a=!0,onError:u}=e,c=null,f=0,p=()=>{let e;return c||(e=c=n().catch(e=>{if(e=e instanceof Error?e:Error(String(e)),u)return new Promise((t,n)=>{u(e,()=>t((f++,c=null,p())),()=>n(e),f+1)});throw e}).then(n=>e!==c&&c?c:(n&&(n.__esModule||"Module"===n[Symbol.toStringTag])&&(n=n.default),t=n,n)))};return nm({name:"AsyncComponentWrapper",__asyncLoader:p,__asyncHydrate(e,n,l){let r=!1;(n.bu||(n.bu=[])).push(()=>r=!0);let i=()=>{r||l()},o=s?()=>{let t=s(i,t=>(function(e,t){if(nT(e)&&"["===e.data){let n=1,l=e.nextSibling;for(;l;){if(1===l.nodeType){if(!1===t(l))break}else if(nT(l))if("]"===l.data){if(0==--n)break}else"["===l.data&&n++;l=l.nextSibling}}else t(e)})(e,t));t&&(n.bum||(n.bum=[])).push(t)}:i;t?o():p().then(()=>!n.isUnmounted&&o())},get __asyncResolved(){return t},setup(){let e=rv;if(ny(e),t)return()=>nL(t,e);let n=t=>{c=null,tN(t,e,13,!r)};if(a&&e.suspense)return p().then(t=>()=>nL(t,e)).catch(e=>(n(e),()=>r?ri(r,{error:e}):null));let s=td(!1),u=td(),f=td(!!i);return i&&setTimeout(()=>{f.value=!1},i),null!=o&&setTimeout(()=>{if(!s.value&&!u.value){let e=Error(`Async component timed out after ${o}ms.`);n(e),u.value=e}},o),p().then(()=>{s.value=!0,e.parent&&nF(e.parent.vnode)&&e.parent.update()}).catch(e=>{n(e),u.value=e}),()=>s.value&&t?nL(t,e):u.value&&r?ri(r,{error:u.value}):l&&!f.value?nL(l,e):void 0}})},e.defineComponent=nm,e.defineCustomElement=ih,e.defineEmits=function(){return null},e.defineExpose=function(e){},e.defineModel=function(){},e.defineOptions=function(e){},e.defineProps=function(){return null},e.defineSSRCustomElement=(e,t)=>ih(e,t,iJ),e.defineSlots=function(){return null},e.devtools=void 0,e.effect=function(e,t){e.effect instanceof ec&&(e=e.effect.fn);let n=new ec(e);t&&x(n,t);try{n.run()}catch(e){throw n.stop(),e}let l=n.run.bind(n);return l.effect=n,l},e.effectScope=function(e){return new ea(e)},e.getCurrentInstance=r_,e.getCurrentScope=function(){return r},e.getCurrentWatcher=function(){return d},e.getTransitionRawChildren=n_,e.guardReactiveProps=rs,e.h=rO,e.handleError=tN,e.hasInjectionContext=function(){return!!(r_()||lh)},e.hydrate=(...e)=>{iz().hydrate(...e)},e.hydrateOnIdle=(e=1e4)=>t=>{let n=nP(t,{timeout:e});return()=>nM(n)},e.hydrateOnInteraction=(e=[])=>(t,n)=>{O(e)&&(e=[e]);let l=!1,r=e=>{l||(l=!0,i(),t(),e.target.dispatchEvent(new e.constructor(e.type,e)))},i=()=>{n(t=>{for(let n of e)t.removeEventListener(n,r)})};return n(t=>{for(let n of e)t.addEventListener(n,r,{once:!0})}),i},e.hydrateOnMediaQuery=e=>t=>{if(e){let n=matchMedia(e);if(!n.matches)return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t);t()}},e.hydrateOnVisible=e=>(t,n)=>{let l=new IntersectionObserver(e=>{for(let n of e)if(n.isIntersecting){l.disconnect(),t();break}},e);return n(e=>{if(e instanceof Element){if(function(e){let{top:t,left:n,bottom:l,right:r}=e.getBoundingClientRect(),{innerHeight:i,innerWidth:s}=window;return(t>0&&t0&&l0&&n0&&rl.disconnect()},e.initCustomFormatter=function(){},e.initDirectivesForSSR=y,e.inject=tY,e.isMemoSame=rR,e.isProxy=to,e.isReactive=tr,e.isReadonly=ti,e.isRef=tp,e.isRuntimeOnly=()=>!c,e.isShallow=ts,e.isVNode=re,e.markRaw=tu,e.mergeDefaults=function(e,t){let n=lt(e);for(let e in t){if(e.startsWith("__skip"))continue;let l=n[e];l?T(l)||A(l)?l=n[e]={type:l,default:t[e]}:l.default=t[e]:null===l&&(l=n[e]={default:t[e]}),l&&t[`__skip_${e}`]&&(l.skipFactory=!0)}return n},e.mergeModels=function(e,t){return e&&t?T(e)&&T(t)?e.concat(t):x({},lt(e),lt(t)):e||t},e.mergeProps=rp,e.nextTick=tV,e.nodeOps=rF,e.normalizeClass=ee,e.normalizeProps=function(e){if(!e)return null;let{class:t,style:n}=e;return t&&!O(t)&&(e.class=ee(t)),n&&(e.style=X(n)),e},e.normalizeStyle=X,e.onActivated=nD,e.onBeforeMount=nK,e.onBeforeUnmount=nJ,e.onBeforeUpdate=nq,e.onDeactivated=nV,e.onErrorCaptured=n0,e.onMounted=nz,e.onRenderTracked=nQ,e.onRenderTriggered=nY,e.onScopeDispose=function(e,t=!1){r&&r.cleanups.push(e)},e.onServerPrefetch=nZ,e.onUnmounted=nX,e.onUpdated=nG,e.onWatcherCleanup=tT,e.openBlock=l8,e.patchProp=ip,e.popScopeId=function(){tq=null},e.provide=tZ,e.proxyRefs=ty,e.pushScopeId=function(e){tq=e},e.queuePostFlushCb=t$,e.reactive=te,e.readonly=tn,e.ref=td,e.registerRuntimeCompiler=function(e){c=e,f=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,n7))}},e.render=iq,e.renderList=function(e,t,n,l){let r,i=n&&n[l],s=T(e);if(s||O(e)){let n=s&&tr(e),l=!1,o=!1;n&&(l=!ts(e),o=ti(e),e=eI(e)),r=Array(e.length);for(let n=0,s=e.length;nt(e,n,void 0,i&&i[n]));else{let n=Object.keys(e);r=Array(n.length);for(let l=0,s=n.length;l0;return"default"!==t&&(n.name=t),l8(),l7(lY,null,[ri("slot",n,l&&l())],e?-2:64)}let i=e[t];i&&i._c&&(i._d=!1),l8();let s=i&&function e(t){return t.some(t=>!re(t)||t.type!==l0&&(t.type!==lY||!!e(t.children)))?t:null}(i(n)),o=n.key||s&&s.key,a=l7(lY,{key:(o&&!R(o)?o:`_${t}`)+(!s&&l?"_fb":"")},s||(l?l():[]),s&&1===e._?64:-2);return!r&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),i&&i._c&&(i._d=!0),a},e.resolveComponent=function(e,t){return n6(n1,e,!0,t)||e},e.resolveDirective=function(e){return n6("directives",e)},e.resolveDynamicComponent=function(e){return O(e)?n6(n1,e,!1)||e:e||n2},e.resolveFilter=null,e.resolveTransitionHooks=nd,e.setBlockTracking=l5,e.setDevtoolsHook=y,e.setTransitionHooks=nv,e.shallowReactive=tt,e.shallowReadonly=function(e){return tl(e,!0,eY,e4,e7)},e.shallowRef=th,e.ssrContextKey=tQ,e.ssrUtils=null,e.stop=function(e){e.effect.stop()},e.toDisplayString=ei,e.toHandlerKey=$,e.toHandlers=function(e,t){let n={};for(let l in e)n[t&&/[A-Z]/.test(l)?`on:${l}`:$(l)]=e[l];return n},e.toRaw=ta,e.toRef=function(e,t,n){if(tp(e))return e;if(A(e))return new tx(e);if(!N(e)||!(arguments.length>1))return td(e);return new tC(e,t,n)},e.toRefs=function(e){let t=T(e)?Array(e.length):{};for(let n in e)t[n]=new tC(e,n,void 0);return t},e.toValue=function(e){return A(e)?e():t_(e)},e.transformVNodeArgs=function(e){},e.triggerRef=function(e){e.dep&&e.dep.trigger()},e.unref=t_,e.useAttrs=function(){return le().attrs},e.useCssModule=function(e="$style"){return _},e.useCssVars=function(e){let t=r_();if(!t)return;let n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(e=>r4(e,n))},l=()=>{let l=e(t.proxy);t.ce?r4(t.ce,l):function e(t,n){if(128&t.shapeFlag){let l=t.suspense;t=l.activeBranch,l.pendingBranch&&!l.isHydrating&&l.effects.push(()=>{e(l.activeBranch,n)})}for(;t.component;)t=t.component.subTree;if(1&t.shapeFlag&&t.el)r4(t.el,n);else if(t.type===lY)t.children.forEach(t=>e(t,n));else if(t.type===l1){let{el:e,anchor:l}=t;for(;e&&(r4(e,n),e!==l);)e=e.nextSibling}}(t.subTree,l),n(l)};nq(()=>{t$(l)}),nz(()=>{t1(l,y,{flush:"post"});let e=new MutationObserver(l);e.observe(t.subTree.el.parentNode,{childList:!0}),nX(()=>e.disconnect())})},e.useHost=i_,e.useId=function(){let e=r_();return e?(e.appContext.config.idPrefix||"v")+"-"+e.ids[0]+e.ids[1]++:""},e.useModel=function(e,t,n=_){let l=r_(),r=D(t),i=U(t),s=lg(e,r),o=tS((s,o)=>{let a,u,c=_;return t0(()=>{let t=e[r];H(a,t)&&(a=t,o())}),{get:()=>(s(),n.get?n.get(a):a),set(e){let s=n.set?n.set(e):e;if(!H(s,a)&&!(c!==_&&H(e,c)))return;let f=l.vnode.props;f&&(t in f||r in f||i in f)&&(`onUpdate:${t}`in f||`onUpdate:${r}`in f||`onUpdate:${i}`in f)||(a=e,o()),l.emit(`update:${t}`,s),H(e,s)&&H(e,c)&&!H(s,u)&&o(),c=e,u=s}}});return o[Symbol.iterator]=()=>{let e=0;return{next:()=>e<2?{value:e++?s||_:o,done:!1}:{done:!0}}},o},e.useSSRContext=()=>{},e.useShadowRoot=function(){let e=i_();return e&&e.shadowRoot},e.useSlots=function(){return le().slots},e.useTemplateRef=function(e){let t=r_(),n=th(null);return t&&Object.defineProperty(t.refs===_?t.refs={}:t.refs,e,{enumerable:!0,get:()=>n.value,set:e=>n.value=e}),n},e.useTransitionState=ns,e.vModelCheckbox=iM,e.vModelDynamic={created(e,t,n){iU(e,t,n,null,"created")},mounted(e,t,n){iU(e,t,n,null,"mounted")},beforeUpdate(e,t,n,l){iU(e,t,n,l,"beforeUpdate")},updated(e,t,n,l){iU(e,t,n,l,"updated")}},e.vModelRadio=iL,e.vModelSelect=iF,e.vModelText=iP,e.vShow={name:"show",beforeMount(e,{value:t},{transition:n}){e[r1]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):r6(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:l}){!t!=!n&&(l?t?(l.beforeEnter(e),r6(e,!0),l.enter(e)):l.leave(e,()=>{r6(e,!1)}):r6(e,t))},beforeUnmount(e,{value:t}){r6(e,t)}},e.version=rN,e.warn=y,e.watch=function(e,t,n){return t1(e,t,n)},e.watchEffect=function(e,t){return t1(e,null,t)},e.watchPostEffect=function(e,t){return t1(e,null,{flush:"post"})},e.watchSyncEffect=t0,e.withAsyncContext=function(e){let t=r_(),n=rS,l=e();ry(),n&&u(!1);let r=()=>{rm(t),n&&u(!0)},i=()=>{r_()!==t&&t.scope.off(),ry(),n&&u(!1)};return P(l)&&(l=l.catch(e=>{throw r(),Promise.resolve().then(()=>Promise.resolve().then(i)),e})),[l,()=>{r(),Promise.resolve().then(i)}]},e.withCtx=tJ,e.withDefaults=function(e,t){return null},e.withDirectives=function(e,t){if(null===tz)return e;let n=rE(tz),l=e.dirs||(e.dirs=[]);for(let e=0;e{let n=e._withKeys||(e._withKeys={}),l=t.join(".");return n[l]||(n[l]=n=>{if(!("key"in n))return;let l=U(n.key);if(t.some(e=>e===l||iH[e]===l))return e(n)})},e.withMemo=function(e,t,n,l){let r=n[l];if(r&&rR(r,e))return r;let i=t();return i.memo=e.slice(),i.cacheIndex=l,n[l]=i},e.withModifiers=(e,t)=>{if(!e)return e;let n=e._withMods||(e._withMods={}),l=t.join(".");return n[l]||(n[l]=(n,...l)=>{for(let e=0;etJ,e}({}); diff --git a/web-ui/res/web-ui-render.precompiled.js b/web-ui/res/web-ui-render.precompiled.js new file mode 100644 index 00000000..ce66e6fa --- /dev/null +++ b/web-ui/res/web-ui-render.precompiled.js @@ -0,0 +1,7263 @@ +window.__CODEXMATE_WEB_UI_RENDER__ = (() => { +const { toDisplayString: _toDisplayString, normalizeClass: _normalizeClass, createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock, createCommentVNode: _createCommentVNode, createTextVNode: _createTextVNode, Fragment: _Fragment, renderList: _renderList, vShow: _vShow, withDirectives: _withDirectives, vModelSelect: _vModelSelect, vModelText: _vModelText, withKeys: _withKeys, withModifiers: _withModifiers, isMemoSame: _isMemoSame, withMemo: _withMemo, normalizeStyle: _normalizeStyle, vModelCheckbox: _vModelCheckbox, vModelDynamic: _vModelDynamic } = Vue + +return function render(_ctx, _cache) { + return (_openBlock(), _createElementBlock(_Fragment, null, [ + (!_ctx.sessionStandalone) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "top-tabs", + role: "tablist", + "aria-label": _ctx.t('nav.topTabs.aria') + }, [ + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["top-tab", { active: _ctx.isMainTabNavActive('dashboard') }]), + id: "tab-dashboard", + role: "tab", + "data-main-tab": "dashboard", + tabindex: _ctx.mainTab === 'dashboard' ? 0 : -1, + "aria-selected": _ctx.mainTab === 'dashboard', + "aria-controls": "panel-dashboard", + onPointerdown: $event => (_ctx.onMainTabPointerDown('dashboard', $event)), + onClick: $event => (_ctx.onMainTabClick('dashboard', $event)) + }, _toDisplayString(_ctx.t('tab.dashboard')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["tabindex", "aria-selected", "onPointerdown", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["top-tab", { active: _ctx.isMainTabNavActive('docs') }]), + id: "tab-docs", + role: "tab", + "data-main-tab": "docs", + tabindex: _ctx.mainTab === 'docs' ? 0 : -1, + "aria-selected": _ctx.mainTab === 'docs', + "aria-controls": "panel-docs", + onPointerdown: $event => (_ctx.onMainTabPointerDown('docs', $event)), + onClick: $event => (_ctx.onMainTabClick('docs', $event)) + }, _toDisplayString(_ctx.t('tab.docs')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["tabindex", "aria-selected", "onPointerdown", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["top-tab", { active: _ctx.isMainTabNavActive('config') }]), + id: "tab-config", + role: "tab", + "data-main-tab": "config", + "data-config-mode": _ctx.configMode, + tabindex: _ctx.mainTab === 'config' ? 0 : -1, + "aria-selected": _ctx.mainTab === 'config', + "aria-controls": _ctx.configMode === 'claude' ? 'panel-config-claude' : (_ctx.configMode === 'openclaw' ? 'panel-config-openclaw' : 'panel-config-provider'), + onPointerdown: $event => (_ctx.onMainTabPointerDown('config', $event)), + onClick: $event => (_ctx.onMainTabClick('config', $event)) + }, _toDisplayString(_ctx.t('tab.config')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["data-config-mode", "tabindex", "aria-selected", "aria-controls", "onPointerdown", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["top-tab", { active: _ctx.isMainTabNavActive('sessions') }]), + id: "tab-sessions", + role: "tab", + "data-main-tab": "sessions", + tabindex: _ctx.mainTab === 'sessions' ? 0 : -1, + "aria-selected": _ctx.mainTab === 'sessions', + "aria-controls": "panel-sessions", + onPointerdown: $event => (_ctx.onMainTabPointerDown('sessions', $event)), + onClick: $event => (_ctx.onMainTabClick('sessions', $event)) + }, _toDisplayString(_ctx.t('tab.sessions')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["tabindex", "aria-selected", "onPointerdown", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["top-tab", { active: _ctx.isMainTabNavActive('usage') }]), + id: "tab-usage", + role: "tab", + "data-main-tab": "usage", + tabindex: _ctx.mainTab === 'usage' ? 0 : -1, + "aria-selected": _ctx.mainTab === 'usage', + "aria-controls": "panel-usage", + onPointerdown: $event => (_ctx.onMainTabPointerDown('usage', $event)), + onClick: $event => (_ctx.onMainTabClick('usage', $event)) + }, _toDisplayString(_ctx.t('tab.usage')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["tabindex", "aria-selected", "onPointerdown", "onClick"]), + (_ctx.taskOrchestrationTabEnabled) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + type: "button", + class: _normalizeClass(["top-tab", { active: _ctx.isMainTabNavActive('orchestration') }]), + id: "tab-orchestration", + role: "tab", + "data-main-tab": "orchestration", + tabindex: _ctx.mainTab === 'orchestration' ? 0 : -1, + "aria-selected": _ctx.mainTab === 'orchestration', + "aria-controls": "panel-orchestration", + onPointerdown: $event => (_ctx.onMainTabPointerDown('orchestration', $event)), + onClick: $event => (_ctx.onMainTabClick('orchestration', $event)) + }, _toDisplayString(_ctx.t('tab.orchestration')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["tabindex", "aria-selected", "onPointerdown", "onClick"])) + : _createCommentVNode("v-if", true), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["top-tab", { active: _ctx.isMainTabNavActive('market') }]), + id: "tab-market", + role: "tab", + "data-main-tab": "market", + tabindex: _ctx.mainTab === 'market' ? 0 : -1, + "aria-selected": _ctx.mainTab === 'market', + "aria-controls": "panel-market", + onPointerdown: $event => (_ctx.onMainTabPointerDown('market', $event)), + onClick: $event => (_ctx.onMainTabClick('market', $event)) + }, _toDisplayString(_ctx.t('tab.market')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["tabindex", "aria-selected", "onPointerdown", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["top-tab", { active: _ctx.isMainTabNavActive('plugins') }]), + id: "tab-plugins", + role: "tab", + "data-main-tab": "plugins", + tabindex: _ctx.mainTab === 'plugins' ? 0 : -1, + "aria-selected": _ctx.mainTab === 'plugins', + "aria-controls": "panel-plugins", + onPointerdown: $event => (_ctx.onMainTabPointerDown('plugins', $event)), + onClick: $event => (_ctx.onMainTabClick('plugins', $event)) + }, _toDisplayString(_ctx.t('tab.plugins')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["tabindex", "aria-selected", "onPointerdown", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["top-tab", { active: _ctx.isMainTabNavActive('settings') }]), + id: "tab-settings", + role: "tab", + "data-main-tab": "settings", + tabindex: _ctx.mainTab === 'settings' ? 0 : -1, + "aria-selected": _ctx.mainTab === 'settings', + "aria-controls": "panel-settings", + onPointerdown: $event => (_ctx.onMainTabPointerDown('settings', $event)), + onClick: $event => (_ctx.onMainTabClick('settings', $event)) + }, _toDisplayString(_ctx.t('tab.settings')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["tabindex", "aria-selected", "onPointerdown", "onClick"]) + ], 8 /* PROPS */, ["aria-label"])) + : _createCommentVNode("v-if", true), + (!_ctx.sessionStandalone) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "lang-fab", + role: "group", + "aria-label": _ctx.t('lang.label') + }, [ + _createElementVNode("div", { + class: "lang-choice", + role: "group", + "aria-label": _ctx.t('lang.label') + }, [ + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["lang-choice-btn", { active: (_ctx.lang || 'zh') === 'zh' }]), + "aria-pressed": (_ctx.lang || 'zh') === 'zh', + onClick: $event => (_ctx.setLang('zh')) + }, "ZH", 10 /* CLASS, PROPS */, ["aria-pressed", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["lang-choice-btn", { active: (_ctx.lang || 'zh') === 'en' }]), + "aria-pressed": (_ctx.lang || 'zh') === 'en', + onClick: $event => (_ctx.setLang('en')) + }, "EN", 10 /* CLASS, PROPS */, ["aria-pressed", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["lang-choice-btn", { active: (_ctx.lang || 'zh') === 'ja' }]), + "aria-pressed": (_ctx.lang || 'zh') === 'ja', + onClick: $event => (_ctx.setLang('ja')) + }, "日本語", 10 /* CLASS, PROPS */, ["aria-pressed", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]) + ], 8 /* PROPS */, ["aria-label"])) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { + class: _normalizeClass(['app-shell', { standalone: _ctx.sessionStandalone }]) + }, [ + (!_ctx.sessionStandalone) + ? (_openBlock(), _createElementBlock("aside", { + key: 0, + class: "side-rail" + }, [ + _createElementVNode("div", { class: "brand-block" }, [ + _createElementVNode("div", { class: "brand-head" }, [ + _createElementVNode("img", { + class: "brand-logo", + src: "/res/logo-pack.webp", + alt: "Codex Mate logo" + }), + _createElementVNode("div", { class: "brand-copy" }, [ + _createElementVNode("div", { class: "brand-kicker" }, [ + _createTextVNode("Codex Mate "), + (_ctx.appVersion) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: "brand-version" + }, "v" + _toDisplayString(_ctx.appVersion), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ]) + ]), + _createElementVNode("div", { class: "brand-subtitle" }, _toDisplayString(_ctx.t('brand.subtitle.localConfigSessionsWorkspace')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "side-rail-nav" }, [ + _createElementVNode("div", { + class: "side-section", + role: "navigation", + "aria-label": _ctx.t('side.overview') + }, [ + _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.overview')), 1 /* TEXT */), + _createElementVNode("button", { + id: "side-tab-dashboard", + "data-main-tab": "dashboard", + "aria-current": _ctx.mainTab === 'dashboard' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('dashboard') }]), + onPointerdown: $event => (_ctx.onMainTabPointerDown('dashboard', $event)), + onClick: $event => (_ctx.onMainTabClick('dashboard', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.overview.doctor')), 1 /* TEXT */), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('side.overview.doctor.meta')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.inspectorHealthStatus), 1 /* TEXT */) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]), + _createElementVNode("div", { + class: "side-section", + role: "navigation", + "aria-label": _ctx.t('side.docs') + }, [ + _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.docs')), 1 /* TEXT */), + _createElementVNode("button", { + id: "side-tab-docs", + "data-main-tab": "docs", + "aria-current": _ctx.mainTab === 'docs' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('docs') }]), + onPointerdown: $event => (_ctx.onMainTabPointerDown('docs', $event)), + onClick: $event => (_ctx.onMainTabClick('docs', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.docs.cliInstall')), 1 /* TEXT */), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('side.docs.cliInstall.meta')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(String(_ctx.installPackageManager || 'npm').toUpperCase()) + " · " + _toDisplayString(_ctx.installCommandAction === 'update' ? _ctx.t('common.update') : (_ctx.installCommandAction === 'uninstall' ? _ctx.t('common.uninstall') : _ctx.t('common.install'))), 1 /* TEXT */) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]), + _createElementVNode("div", { + class: "side-section", + role: "navigation", + "aria-label": _ctx.t('side.config') + }, [ + _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.config')), 1 /* TEXT */), + _createElementVNode("button", { + id: "side-tab-config-codex", + "data-main-tab": "config", + "data-config-mode": "codex", + "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'codex' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isConfigModeNavActive('codex') }]), + onPointerdown: $event => (_ctx.onConfigTabPointerDown('codex', $event)), + onClick: $event => (_ctx.onConfigTabClick('codex', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.codex')), 1 /* TEXT */), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.codex.meta')), 1 /* TEXT */), + (_ctx.currentProvider) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.t('common.current', { value: _ctx.currentProvider })), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]), + _createElementVNode("button", { + id: "side-tab-config-claude", + "data-main-tab": "config", + "data-config-mode": "claude", + "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'claude' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isConfigModeNavActive('claude') }]), + onPointerdown: $event => (_ctx.onConfigTabPointerDown('claude', $event)), + onClick: $event => (_ctx.onConfigTabClick('claude', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.claude')), 1 /* TEXT */), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.claude.meta')), 1 /* TEXT */), + (_ctx.currentClaudeConfig) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.t('common.current', { value: _ctx.currentClaudeConfig })), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]), + _createElementVNode("button", { + id: "side-tab-config-openclaw", + "data-main-tab": "config", + "data-config-mode": "openclaw", + "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'openclaw' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isConfigModeNavActive('openclaw') }]), + onPointerdown: $event => (_ctx.onConfigTabPointerDown('openclaw', $event)), + onClick: $event => (_ctx.onConfigTabClick('openclaw', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.openclaw')), 1 /* TEXT */), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.openclaw.meta')), 1 /* TEXT */), + (_ctx.currentOpenclawConfig) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.t('common.current', { value: _ctx.currentOpenclawConfig })), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]), + _createElementVNode("div", { + class: "side-section", + role: "navigation", + "aria-label": _ctx.t('side.sessions') + }, [ + _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.sessions')), 1 /* TEXT */), + _createElementVNode("button", { + id: "side-tab-sessions", + "data-main-tab": "sessions", + "aria-current": _ctx.mainTab === 'sessions' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('sessions') }]), + onPointerdown: $event => (_ctx.onMainTabPointerDown('sessions', $event)), + onClick: $event => (_ctx.onMainTabClick('sessions', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.sessions.browser')), 1 /* TEXT */), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('side.sessions.browser.meta')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.t('sessions.sourceLabel', { value: (_ctx.sessionFilterSource === 'all' ? _ctx.t('sessions.source.all') : (_ctx.sessionFilterSource === 'claude' ? 'Claude Code' : (_ctx.sessionFilterSource === 'gemini' ? 'Gemini CLI' : (_ctx.sessionFilterSource === 'codebuddy' ? 'CodeBuddy Code' : 'Codex')))) })), 1 /* TEXT */) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]), + _createElementVNode("button", { + id: "side-tab-usage", + "data-main-tab": "usage", + "aria-current": _ctx.mainTab === 'usage' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('usage') }]), + onPointerdown: $event => (_ctx.onMainTabPointerDown('usage', $event)), + onClick: $event => (_ctx.onMainTabClick('usage', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('tab.usage')), 1 /* TEXT */), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('side.usage.meta')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.t('usage.rangeLabel', { value: (_ctx.sessionsUsageTimeRange === 'all' ? _ctx.t('usage.range.all') : (_ctx.sessionsUsageTimeRange === '30d' ? _ctx.t('usage.range.30d.short') : _ctx.t('usage.range.7d.short'))) })), 1 /* TEXT */) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]), + (_ctx.taskOrchestrationTabEnabled) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "side-section", + role: "navigation", + "aria-label": _ctx.t('side.orchestration') + }, [ + _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.orchestration')), 1 /* TEXT */), + _createElementVNode("button", { + id: "side-tab-orchestration", + "data-main-tab": "orchestration", + "aria-current": _ctx.mainTab === 'orchestration' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('orchestration') }]), + onPointerdown: $event => (_ctx.onMainTabPointerDown('orchestration', $event)), + onClick: $event => (_ctx.onMainTabClick('orchestration', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('tab.orchestration')), 1 /* TEXT */), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('side.orchestration.meta')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.t('orchestration.queueStats', { running: _ctx.taskOrchestrationQueueStats.running, queued: _ctx.taskOrchestrationQueueStats.queued })), 1 /* TEXT */) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]) + ], 8 /* PROPS */, ["aria-label"])) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { + class: "side-section", + role: "navigation", + "aria-label": _ctx.t('side.skills') + }, [ + _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.skills')), 1 /* TEXT */), + _createElementVNode("button", { + id: "side-tab-market", + "data-main-tab": "market", + "aria-current": _ctx.mainTab === 'market' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('market') }]), + onPointerdown: $event => (_ctx.onMainTabPointerDown('market', $event)), + onClick: $event => (_ctx.onMainTabClick('market', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('tab.market')), 1 /* TEXT */), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('skills.localLabel', { target: _ctx.skillsTargetLabel })), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.t('skills.counts', { installed: _ctx.skillsList.length, importable: _ctx.skillsImportList.length })), 1 /* TEXT */) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]), + _createElementVNode("div", { + class: "side-section", + role: "navigation", + "aria-label": _ctx.t('side.plugins') + }, [ + _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.plugins')), 1 /* TEXT */), + _createElementVNode("button", { + id: "side-tab-plugins", + "data-main-tab": "plugins", + "aria-current": _ctx.mainTab === 'plugins' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('plugins') }]), + onPointerdown: $event => (_ctx.onMainTabPointerDown('plugins', $event)), + onClick: $event => (_ctx.onMainTabClick('plugins', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.plugins.tools')), 1 /* TEXT */), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('side.plugins.tools.meta')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.promptTemplatesList.length) + " templates", 1 /* TEXT */) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]), + _createElementVNode("div", { + class: "side-section", + role: "navigation", + "aria-label": _ctx.t('side.system') + }, [ + _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.system')), 1 /* TEXT */), + _createElementVNode("button", { + id: "side-tab-settings", + "data-main-tab": "settings", + "aria-current": _ctx.mainTab === 'settings' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('settings') }]), + onPointerdown: $event => (_ctx.onMainTabPointerDown('settings', $event)), + onClick: $event => (_ctx.onMainTabClick('settings', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.system.settings')), 1 /* TEXT */), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('side.system.settings.meta')), 1 /* TEXT */) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]), + _createElementVNode("button", { + id: "side-tab-trash", + "data-main-tab": "trash", + "aria-current": _ctx.mainTab === 'trash' ? 'page' : null, + class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('trash') }]), + onPointerdown: $event => (_ctx.onMainTabPointerDown('trash', $event)), + onClick: $event => (_ctx.onMainTabClick('trash', $event)) + }, [ + _createElementVNode("div", { class: "side-item-title" }, "回收站"), + _createElementVNode("div", { class: "side-item-meta" }, [ + _createElementVNode("span", null, "已删除会话"), + (_ctx.sessionTrashCount > 0) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: "side-item-badge" + }, _toDisplayString(_ctx.sessionTrashCount), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]) + ]), + _createElementVNode("div", { + class: "side-rail-lang", + role: "group", + "aria-label": _ctx.t('lang.label') + }, [ + _createElementVNode("div", { + class: "lang-choice", + role: "group", + "aria-label": _ctx.t('lang.label') + }, [ + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["lang-choice-btn", { active: (_ctx.lang || 'zh') === 'zh' }]), + "aria-pressed": (_ctx.lang || 'zh') === 'zh', + onClick: $event => (_ctx.setLang('zh')) + }, "ZH", 10 /* CLASS, PROPS */, ["aria-pressed", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["lang-choice-btn", { active: (_ctx.lang || 'zh') === 'en' }]), + "aria-pressed": (_ctx.lang || 'zh') === 'en', + onClick: $event => (_ctx.setLang('en')) + }, "EN", 10 /* CLASS, PROPS */, ["aria-pressed", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["lang-choice-btn", { active: (_ctx.lang || 'zh') === 'ja' }]), + "aria-pressed": (_ctx.lang || 'zh') === 'ja', + onClick: $event => (_ctx.setLang('ja')) + }, "日本語", 10 /* CLASS, PROPS */, ["aria-pressed", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]) + ], 8 /* PROPS */, ["aria-label"]) + ])) + : _createCommentVNode("v-if", true), + _createElementVNode("main", { class: "main-panel" }, [ + _createElementVNode("div", { class: "main-panel-topbar" }, [ + (!_ctx.sessionStandalone) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "panel-header panel-header-refined" + }, [ + _createElementVNode("div", { class: "panel-header-copy" }, [ + _createElementVNode("div", { class: "panel-kicker" }, _toDisplayString(_ctx.mainTabKicker), 1 /* TEXT */), + _createElementVNode("h1", { class: "main-title" }, _toDisplayString(_ctx.mainTabTitle), 1 /* TEXT */), + _createElementVNode("p", { class: "subtitle" }, _toDisplayString(_ctx.mainTabSubtitle), 1 /* TEXT */) + ]) + ])) + : _createCommentVNode("v-if", true), + (!_ctx.sessionStandalone && _ctx.mainTab === 'config') + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "status-strip" + }, [ + (_ctx.isProviderConfigMode) + ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [ + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.activeProviderConfigChipLabel), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.currentProvider || _ctx.t('common.notSelected')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.activeProviderModelChipLabel), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.currentModel || _ctx.t('common.notSelected')), 1 /* TEXT */) + ]) + ], 64 /* STABLE_FRAGMENT */)) + : (_ctx.configMode === 'claude') + ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [ + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.claudeConfig')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.currentClaudeConfig || _ctx.t('common.notSelected')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.claudeModel')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.currentClaudeModel || _ctx.t('common.notSelected')), 1 /* TEXT */) + ]) + ], 64 /* STABLE_FRAGMENT */)) + : (_ctx.configMode === 'openclaw') + ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [ + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.openclawConfig')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.currentOpenclawConfig || _ctx.t('common.notSelected')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.workspaceFile')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.openclawWorkspaceFileName || _ctx.t('common.notSelected')), 1 /* TEXT */) + ]) + ], 64 /* STABLE_FRAGMENT */)) + : (_openBlock(), _createElementBlock("div", { + key: 3, + class: "status-chip" + }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.configMode')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.t('common.notSelected')), 1 /* TEXT */) + ])) + ])) + : (!_ctx.sessionStandalone && _ctx.mainTab === 'sessions') + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "status-strip" + }, [ + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.currentSource')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.sessionFilterSource === 'all' + ? _ctx.t('sessions.source.all') + : (_ctx.sessionFilterSource === 'codex' + ? _ctx.t('sessions.source.codex') + : (_ctx.sessionFilterSource === 'claude' + ? _ctx.t('sessions.source.claudeCode') + : (_ctx.sessionFilterSource === 'gemini' + ? _ctx.t('sessions.source.gemini') + : (_ctx.sessionFilterSource === 'codebuddy' + ? _ctx.t('sessions.source.codebuddy') + : _ctx.t('sessions.source.codex')))))), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.sessionCount')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.sessionsList.length), 1 /* TEXT */) + ]) + ])) + : (!_ctx.sessionStandalone && _ctx.mainTab === 'usage') + ? (_openBlock(), _createElementBlock("div", { + key: 3, + class: "status-strip" + }, [ + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.range')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.sessionsUsageTimeRange === 'all' ? _ctx.t('usage.range.all') : (_ctx.sessionsUsageTimeRange === '30d' ? _ctx.t('usage.range.30d.short') : _ctx.t('usage.range.7d.short'))), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.totalSessions')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.sessionUsageSummaryCards[0] ? _ctx.sessionUsageSummaryCards[0].value : 0), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.totalMessages')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.sessionUsageSummaryCards[1] ? _ctx.sessionUsageSummaryCards[1].value : 0), 1 /* TEXT */) + ]) + ])) + : (!_ctx.sessionStandalone && _ctx.taskOrchestrationTabEnabled && _ctx.mainTab === 'orchestration') + ? (_openBlock(), _createElementBlock("div", { + key: 4, + class: "status-strip" + }, [ + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.engine')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.taskOrchestration.selectedEngine === 'workflow' ? 'Workflow' : 'Codex'), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.concurrency')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.taskOrchestration.concurrency), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.running')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.taskOrchestrationQueueStats.running), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.queued')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.taskOrchestrationQueueStats.queued), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.runs')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.taskOrchestration.runs.length), 1 /* TEXT */) + ]) + ])) + : (!_ctx.sessionStandalone && _ctx.mainTab === 'market') + ? (_openBlock(), _createElementBlock("div", { + key: 5, + class: "status-strip" + }, [ + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.currentTarget')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.skillsTargetLabel), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.localSkills')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.skillsList.length), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.importable')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.skillsImportList.length), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.importableDirect')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.skillsImportConfiguredCount), 1 /* TEXT */) + ]) + ])) + : (!_ctx.sessionStandalone && _ctx.mainTab === 'docs') + ? (_openBlock(), _createElementBlock("div", { + key: 6, + class: "status-strip" + }, [ + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.pm')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(String(_ctx.installPackageManager || 'npm').toUpperCase()), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.action')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.installCommandAction === 'update' ? _ctx.t('common.update') : (_ctx.installCommandAction === 'uninstall' ? _ctx.t('common.uninstall') : _ctx.t('common.install'))), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, _toDisplayString(_ctx.t('status.registry')), 1 /* TEXT */), + _createElementVNode("span", { class: "value" }, _toDisplayString(_ctx.installRegistryPreview || _ctx.t('common.defaultOfficial')), 1 /* TEXT */) + ]) + ])) + : (!_ctx.sessionStandalone) + ? (_openBlock(), _createElementBlock("div", { + key: 7, + class: "status-strip status-strip-placeholder", + "aria-hidden": "true" + }, [ + _createElementVNode("div", { class: "status-chip" }, [ + _createElementVNode("span", { class: "label" }, " "), + _createElementVNode("span", { class: "value" }, " ") + ]) + ])) + : _createCommentVNode("v-if", true), + (!_ctx.sessionStandalone && _ctx.mainTab === 'config' && _ctx.isProviderConfigMode && _ctx.forceCompactLayout && !_ctx.loading && !_ctx.initError && _ctx.displayProvidersList.length > 1) + ? (_openBlock(), _createElementBlock("div", { + key: 8, + class: "provider-fast-switch" + }, [ + _createElementVNode("label", { + class: "provider-fast-switch-label", + for: "provider-fast-switch-select" + }, _toDisplayString(_ctx.t('status.quickSwitchProvider')), 1 /* TEXT */), + _createElementVNode("select", { + id: "provider-fast-switch-select", + class: "provider-fast-switch-select", + value: _ctx.displayCurrentProvider, + onChange: $event => (_ctx.quickSwitchProvider($event.target.value)) + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.displayProvidersList, (provider) => { + return (_openBlock(), _createElementBlock("option", { + key: 'quick-switch-' + provider.name, + value: provider.name + }, _toDisplayString(provider.name), 9 /* TEXT, PROPS */, ["value"])) + }), 128 /* KEYED_FRAGMENT */)) + ], 40 /* PROPS, NEED_HYDRATION */, ["value", "onChange"]) + ])) + : _createCommentVNode("v-if", true) + ]), + _createCommentVNode(" 内容包裹器 - 稳定布局 "), + _createElementVNode("div", { class: "content-wrapper" }, [ + _withDirectives(_createElementVNode("div", { + class: "mode-content", + id: "panel-dashboard", + role: "tabpanel", + "aria-labelledby": 'tab-dashboard' + }, [ + _createElementVNode("div", { class: "selector-section doctor-hero" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('dashboard.doctor.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "selector-actions" }, [ + _createElementVNode("button", { + class: "btn-tool btn-tool-compact", + onClick: _ctx.runHealthCheck, + disabled: _ctx.loading || !!_ctx.initError || _ctx.healthCheckLoading + }, _toDisplayString(_ctx.healthCheckLoading ? _ctx.t('dashboard.doctor.checking') : _ctx.t('dashboard.doctor.runChecks')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + _createElementVNode("div", { class: "doctor-grid" }, [ + _createElementVNode("button", { + type: "button", + class: "doctor-card", + onClick: $event => (_ctx.switchMainTab('config')), + disabled: _ctx.loading || !!_ctx.initError + }, [ + _createElementVNode("div", { class: "doctor-card-title" }, _toDisplayString(_ctx.t('dashboard.card.config')), 1 /* TEXT */), + _createElementVNode("div", { class: "doctor-card-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.inspectorConfigModeLabel), 1 /* TEXT */), + _createElementVNode("span", null, "·"), + _createElementVNode("span", null, _toDisplayString(_ctx.inspectorCurrentConfigLabel), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "doctor-card-kv" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.kv.model')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.inspectorCurrentModelLabel), 1 /* TEXT */) + ]) + ], 8 /* PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "doctor-card", + onClick: $event => (_ctx.switchMainTab('sessions')), + disabled: _ctx.loading || !!_ctx.initError + }, [ + _createElementVNode("div", { class: "doctor-card-title" }, _toDisplayString(_ctx.t('dashboard.card.sessions')), 1 /* TEXT */), + _createElementVNode("div", { class: "doctor-card-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.sessionsLoading ? _ctx.t('dashboard.state.loading') : (_ctx.sessionsLoadedOnce ? _ctx.t('dashboard.state.ready') : _ctx.t('dashboard.state.idle'))), 1 /* TEXT */), + _createElementVNode("span", null, "·"), + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.sessions.count', { count: _ctx.sessionsList.length })), 1 /* TEXT */) + ]), + (_ctx.activeSessionDetailError) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "doctor-card-kv" + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.kv.issue')), 1 /* TEXT */), + _createElementVNode("span", { class: "doctor-kv-error" }, _toDisplayString(_ctx.activeSessionDetailError), 1 /* TEXT */) + ])) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "doctor-card-kv" + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.kv.active')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.activeSession ? (_ctx.activeSession.title || _ctx.activeSession.sessionId) : _ctx.t('dashboard.none')), 1 /* TEXT */) + ])) + ], 8 /* PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "doctor-card", + onClick: $event => (_ctx.switchMainTab('usage')), + disabled: _ctx.loading || !!_ctx.initError + }, [ + _createElementVNode("div", { class: "doctor-card-title" }, _toDisplayString(_ctx.t('dashboard.card.usage')), 1 /* TEXT */), + _createElementVNode("div", { class: "doctor-card-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.sessionsUsageLoading ? _ctx.t('dashboard.state.loading') : (_ctx.sessionsUsageLoadedOnce ? _ctx.t('dashboard.state.ready') : _ctx.t('dashboard.state.idle'))), 1 /* TEXT */), + _createElementVNode("span", null, "·"), + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.usage.range', { value: (_ctx.sessionsUsageTimeRange === 'all' ? _ctx.t('usage.range.all') : (_ctx.sessionsUsageTimeRange === '30d' ? _ctx.t('usage.range.30d.short') : _ctx.t('usage.range.7d.short'))) })), 1 /* TEXT */) + ]), + (_ctx.sessionsUsageError) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "doctor-card-kv" + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.kv.issue')), 1 /* TEXT */), + _createElementVNode("span", { class: "doctor-kv-error" }, _toDisplayString(_ctx.sessionsUsageError), 1 /* TEXT */) + ])) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "doctor-card-kv" + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.kv.sessions')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.sessionUsageSummaryCards[0] ? _ctx.sessionUsageSummaryCards[0].value : 0), 1 /* TEXT */) + ])), + (_ctx.sessionsUsageLoadedOnce + && _ctx.sessionsUsageList.filter(session => !(session && typeof session.model === 'string' && session.model.trim())).length) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "doctor-card-kv" + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.kv.missingModel')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.sessionsUsageList.filter(session => !(session && typeof session.model === 'string' && session.model.trim())).length), 1 /* TEXT */) + ])) + : _createCommentVNode("v-if", true) + ], 8 /* PROPS */, ["onClick", "disabled"]), + (_ctx.taskOrchestrationTabEnabled) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + type: "button", + class: "doctor-card", + onClick: $event => (_ctx.switchMainTab('orchestration')), + disabled: _ctx.loading || !!_ctx.initError + }, [ + _createElementVNode("div", { class: "doctor-card-title" }, _toDisplayString(_ctx.t('dashboard.card.tasks')), 1 /* TEXT */), + _createElementVNode("div", { class: "doctor-card-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.taskOrchestration && _ctx.taskOrchestration.loading ? _ctx.t('dashboard.state.loading') : _ctx.t('dashboard.state.ready')), 1 /* TEXT */), + _createElementVNode("span", null, "·"), + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.tasks.queue', { running: _ctx.taskOrchestrationQueueStats.running, queued: _ctx.taskOrchestrationQueueStats.queued })), 1 /* TEXT */) + ]), + (_ctx.taskOrchestration && _ctx.taskOrchestration.planIssues && _ctx.taskOrchestration.planIssues.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "doctor-card-kv" + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.kv.blockers')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.taskOrchestration.planIssues.length), 1 /* TEXT */) + ])) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "doctor-card-kv" + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.kv.runs')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.taskOrchestration && _ctx.taskOrchestration.runs ? _ctx.taskOrchestration.runs.length : 0), 1 /* TEXT */) + ])) + ], 8 /* PROPS */, ["onClick", "disabled"])) + : _createCommentVNode("v-if", true), + _createElementVNode("button", { + type: "button", + class: "doctor-card", + onClick: $event => (_ctx.switchMainTab('market')), + disabled: _ctx.loading || !!_ctx.initError + }, [ + _createElementVNode("div", { class: "doctor-card-title" }, _toDisplayString(_ctx.t('dashboard.card.skills')), 1 /* TEXT */), + _createElementVNode("div", { class: "doctor-card-meta" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.skillsMarketBusy ? _ctx.t('dashboard.state.loading') : _ctx.t('dashboard.state.ready')), 1 /* TEXT */), + _createElementVNode("span", null, "·"), + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.skills.count', { installed: _ctx.skillsList.length, importable: _ctx.skillsImportList.length })), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "doctor-card-kv" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.kv.target')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.skillsTargetLabel), 1 /* TEXT */) + ]), + (_ctx.skillsRootPath) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "doctor-card-kv" + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.kv.root')), 1 /* TEXT */), + _createElementVNode("span", null, _toDisplayString(_ctx.skillsRootPath), 1 /* TEXT */) + ])) + : _createCommentVNode("v-if", true) + ], 8 /* PROPS */, ["onClick", "disabled"]) + ]), + _createElementVNode("div", { class: "doctor-status-row" }, [ + _createElementVNode("div", { + class: _normalizeClass(["doctor-status-chip", _ctx.inspectorHealthTone]) + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.status.health')), 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.inspectorHealthStatus), 1 /* TEXT */) + ], 2 /* CLASS */), + _createElementVNode("div", { class: "doctor-status-chip" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.status.busy')), 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.inspectorBusyStatus), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "doctor-status-chip" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('dashboard.status.models')), 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.inspectorModelLoadStatus), 1 /* TEXT */) + ]) + ]), + (_ctx.healthCheckResult) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: _normalizeClass(["doctor-health-result", _ctx.healthCheckResult.ok ? 'ok' : 'error']) + }, [ + _createElementVNode("div", { class: "doctor-health-title" }, [ + _createTextVNode(_toDisplayString(_ctx.healthCheckResult.ok ? _ctx.t('dashboard.health.ok') : _ctx.t('dashboard.health.fail')) + " ", 1 /* TEXT */), + (_ctx.healthCheckResult.issues && _ctx.healthCheckResult.issues.length) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, "(" + _toDisplayString(_ctx.t('dashboard.health.issues', { count: _ctx.healthCheckResult.issues.length })) + ")", 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ], 2 /* CLASS */)) + : _createCommentVNode("v-if", true), + (_ctx.healthCheckResult && _ctx.healthCheckResult.report && _ctx.healthCheckResult.report.issues && _ctx.healthCheckResult.report.issues.length) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "doctor-action-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.healthCheckResult.report.issues, (issue) => { + return (_openBlock(), _createElementBlock("div", { + key: issue.id, + class: "doctor-action-card" + }, [ + _createElementVNode("div", { class: "doctor-action-head" }, [ + _createElementVNode("div", { class: "doctor-action-title" }, _toDisplayString(issue.problem || (issue.problemKey ? _ctx.t(issue.problemKey, issue.problemParams) : '')), 1 /* TEXT */), + _createElementVNode("div", { + class: _normalizeClass(['doctor-action-severity', issue.severity]) + }, _toDisplayString(issue.severityLabel || issue.severity), 3 /* TEXT, CLASS */) + ]), + _createElementVNode("div", { class: "doctor-action-impact" }, _toDisplayString(issue.impact || (issue.impactKey ? _ctx.t(issue.impactKey, issue.impactParams) : '')), 1 /* TEXT */), + (issue.actions && issue.actions.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "doctor-action-buttons" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(issue.actions, (action, index) => { + return (_openBlock(), _createElementBlock(_Fragment, { + key: issue.id + '-action-' + index + }, [ + (action.type === 'navigate') + ? (_openBlock(), _createElementBlock("button", { + key: 0, + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.switchMainTab(action.target)) + }, _toDisplayString(action.label || (action.labelKey ? _ctx.t(action.labelKey, action.labelParams) : _ctx.t('dashboard.doctor.open'))), 9 /* TEXT, PROPS */, ["onClick"])) + : (action.type === 'run-check') + ? (_openBlock(), _createElementBlock("button", { + key: 1, + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.runHealthCheck({ doctor: true, forceRefresh: true })), + disabled: _ctx.healthCheckLoading + }, _toDisplayString(_ctx.t('dashboard.doctor.runChecks')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])) + : (action.type === 'export') + ? (_openBlock(), _createElementBlock("button", { + key: 2, + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => {_ctx.healthCheckResult && _ctx.healthCheckResult.report + ? (action.format === 'md' + ? _ctx.downloadTextFile('codexmate-doctor.md', String(_ctx.healthCheckResult.markdown || ''), 'text/markdown;charset=utf-8') + : _ctx.downloadTextFile('codexmate-doctor.json', JSON.stringify(_ctx.healthCheckResult.report, null, 2), 'application/json;charset=utf-8')) + : null} + }, _toDisplayString(action.format === 'md' ? _ctx.t('dashboard.doctor.export.md') : _ctx.t('dashboard.doctor.export.json')), 9 /* TEXT, PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true) + ], 64 /* STABLE_FRAGMENT */)) + }), 128 /* KEYED_FRAGMENT */)) + ])) + : _createCommentVNode("v-if", true) + ])) + }), 128 /* KEYED_FRAGMENT */)), + _createElementVNode("div", { class: "doctor-action-footer" }, [ + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => {_ctx.healthCheckResult && _ctx.healthCheckResult.report + ? _ctx.downloadTextFile('codexmate-doctor.json', JSON.stringify(_ctx.healthCheckResult.report, null, 2), 'application/json;charset=utf-8') + : null} + }, _toDisplayString(_ctx.t('dashboard.doctor.export.json')), 9 /* TEXT, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => {_ctx.healthCheckResult && _ctx.healthCheckResult.report + ? _ctx.downloadTextFile('codexmate-doctor.md', String(_ctx.healthCheckResult.markdown || ''), 'text/markdown;charset=utf-8') + : null} + }, _toDisplayString(_ctx.t('dashboard.doctor.export.md')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ])) + : _createCommentVNode("v-if", true) + ]) + ], 512 /* NEED_PATCH */), [ + [_vShow, _ctx.mainTab === 'dashboard'] + ]), + _createCommentVNode(" Codex 配置 "), + _withDirectives(_createElementVNode("div", { + class: "mode-content mode-cards", + id: "panel-config-provider", + role: "tabpanel", + "aria-labelledby": _ctx.forceCompactLayout ? 'tab-config' : ('side-tab-config-' + _ctx.configMode) + }, [ + (_ctx.forceCompactLayout && !_ctx.sessionStandalone) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "segmented-control" + }, [ + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]), + onClick: $event => (_ctx.switchConfigMode('codex')) + }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]), + onClick: $event => (_ctx.switchConfigMode('claude')) + }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]), + onClick: $event => (_ctx.switchConfigMode('openclaw')) + }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]) + ])) + : _createCommentVNode("v-if", true), + (_ctx.isCodexConfigMode && _ctx.shouldShowCliInstallPlaceholder('codex')) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "selector-section" + }, [ + _createElementVNode("div", { class: "empty-state" }, [ + _createElementVNode("div", { class: "empty-state-title" }, _toDisplayString(_ctx.t('cli.missing.title', { name: 'Codex' })), 1 /* TEXT */), + _createElementVNode("div", { class: "empty-state-subtitle" }, _toDisplayString(_ctx.t('cli.missing.subtitle', { name: 'Codex' })), 1 /* TEXT */), + _createElementVNode("div", { class: "docs-command-row" }, [ + _createElementVNode("div", { + class: "docs-command-box", + role: "group", + "aria-label": _ctx.t('cli.missing.commandAria', { name: 'Codex' }) + }, [ + _createElementVNode("code", { class: "install-command" }, _toDisplayString(_ctx.getInstallCommand('codex', 'install')), 1 /* TEXT */), + _createElementVNode("button", { + type: "button", + class: "btn-mini docs-copy-btn", + disabled: !_ctx.getInstallCommand('codex', 'install'), + onClick: $event => (_ctx.copyInstallCommand(_ctx.getInstallCommand('codex', 'install'))) + }, _toDisplayString(_ctx.t('common.copy')), 9 /* TEXT, PROPS */, ["disabled", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]) + ]), + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => {_ctx.mainTab = 'docs'; _ctx.setInstallCommandAction('install')} + }, _toDisplayString(_ctx.t('cli.missing.openDocs')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ])) + : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [ + (!_ctx.loading && !_ctx.initError) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + class: "btn-add", + onClick: $event => (_ctx.showAddModal = true) + }, [ + (_openBlock(), _createElementBlock("svg", { + class: "icon", + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M10 4v12M4 10h12" }) + ])), + _createTextVNode(" " + _toDisplayString(_ctx.t('config.addProvider')), 1 /* TEXT */) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + (_ctx.isCodexConfigMode && _ctx.codexProviderTemplates.length) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "selector-section" + }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.providerTemplate.title')), 1 /* TEXT */) + ]), + _createElementVNode("div", { + class: "btn-group", + style: {"flex-wrap":"wrap","gap":"8px","margin-top":"0"} + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.codexProviderTemplates, (tpl) => { + return (_openBlock(), _createElementBlock("button", { + key: tpl.name, + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newProvider.name = tpl.name; _ctx.newProvider.url = tpl.url; _ctx.newProvider._suggestedModel = tpl.model || ''; _ctx.newProvider.useTransform = !!tpl.useTransform; _ctx.showAddModal = true} + }, _toDisplayString(tpl.label), 9 /* TEXT, PROPS */, ["onClick"])) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ])) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, "AGENTS.md") + ]), + _createElementVNode("button", { + class: "btn-tool", + onClick: _ctx.openAgentsEditor, + disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading + }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('config.agents.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.models')), 1 /* TEXT */), + _createElementVNode("div", { class: "selector-actions" }, [ + (_ctx.modelsSource === 'legacy') + ? (_openBlock(), _createElementBlock("button", { + key: 0, + class: "btn-icon", + onClick: $event => (_ctx.showModelModal = true), + "aria-label": _ctx.t('modal.modelAdd.title'), + title: _ctx.t('modal.modelAdd.title') + }, "+", 8 /* PROPS */, ["onClick", "aria-label", "title"])) + : _createCommentVNode("v-if", true), + (_ctx.modelsSource === 'legacy') + ? (_openBlock(), _createElementBlock("button", { + key: 1, + class: "btn-icon", + onClick: $event => (_ctx.showModelListModal = true), + "aria-label": _ctx.t('modal.modelManage.title'), + title: _ctx.t('modal.modelManage.title') + }, "≡", 8 /* PROPS */, ["onClick", "aria-label", "title"])) + : _createCommentVNode("v-if", true) + ]) + ]), + (_ctx.codexModelsLoading || _ctx.modelsSource === 'remote') + ? _withDirectives((_openBlock(), _createElementBlock("select", { + key: 0, + class: "model-select", + "onUpdate:modelValue": $event => ((_ctx.currentModel) = $event), + onChange: _ctx.onModelChange, + disabled: _ctx.codexModelsLoading + }, [ + (_ctx.codexModelsLoading) + ? (_openBlock(), _createElementBlock("option", { + key: 0, + value: "" + }, _toDisplayString(_ctx.t('config.modelLoading')), 1 /* TEXT */)) + : (_openBlock(true), _createElementBlock(_Fragment, { key: 1 }, _renderList(_ctx.codexModelOptions, (model) => { + return (_openBlock(), _createElementBlock("option", { + key: model, + value: model + }, _toDisplayString(model), 9 /* TEXT, PROPS */, ["value"])) + }), 128 /* KEYED_FRAGMENT */)) + ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange", "disabled"])), [ + [_vModelSelect, _ctx.currentModel] + ]) + : _createCommentVNode("v-if", true), + (!_ctx.codexModelsLoading && (_ctx.modelsSource !== 'remote' || !_ctx.modelsHasCurrent)) + ? _withDirectives((_openBlock(), _createElementBlock("input", { + key: 1, + class: "model-input", + "onUpdate:modelValue": $event => ((_ctx.currentModel) = $event), + onBlur: _ctx.onModelChange, + onKeyup: _withKeys(_ctx.onModelChange, ["enter"]), + placeholder: _ctx.activeProviderModelPlaceholder, + list: _ctx.codexModelHasList ? 'codex-model-options' : null + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur", "onKeyup", "placeholder", "list"])), [ + [_vModelText, _ctx.currentModel] + ]) + : _createCommentVNode("v-if", true), + (_ctx.codexModelHasList) + ? (_openBlock(), _createElementBlock("datalist", { + key: 2, + id: "codex-model-options" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.codexModelOptions, (model) => { + return (_openBlock(), _createElementBlock("option", { + key: model, + value: model + }, null, 8 /* PROPS */, ["value"])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + : _createCommentVNode("v-if", true), + (_ctx.modelsSource === 'unlimited') + ? (_openBlock(), _createElementBlock("div", { + key: 3, + class: "config-template-hint" + }, _toDisplayString(_ctx.t('config.models.unlimited')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.modelsSource === 'error') + ? (_openBlock(), _createElementBlock("div", { + key: 4, + class: "config-template-hint" + }, _toDisplayString(_ctx.t('config.models.error')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.modelsSource === 'remote' && !_ctx.modelsHasCurrent) + ? (_openBlock(), _createElementBlock("div", { + key: 5, + class: "config-template-hint" + }, _toDisplayString(_ctx.isCodexConfigMode ? _ctx.t('config.models.notInList.codex') : _ctx.t('config.models.notInList.other')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.isCodexConfigMode) + ? (_openBlock(), _createElementBlock("div", { + key: 6, + class: "config-template-hint" + }, _toDisplayString(_ctx.t('config.template.editFirst')), 1 /* TEXT */)) + : (_ctx.activeProviderBridgeHint) + ? (_openBlock(), _createElementBlock("div", { + key: 7, + class: "config-template-hint" + }, _toDisplayString(_ctx.t('config.template.bridgeCodexOnly', { hint: _ctx.activeProviderBridgeHint })), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.isCodexConfigMode) + ? (_openBlock(), _createElementBlock("button", { + key: 8, + class: "btn-tool btn-template-editor", + onClick: _ctx.openConfigTemplateEditor, + disabled: _ctx.loading || !!_ctx.initError + }, _toDisplayString(_ctx.t('config.template.openEditor')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])) + : _createCommentVNode("v-if", true) + ]), + (_ctx.isCodexConfigMode) + ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [ + _createElementVNode("div", { class: "config-row" }, [ + _createElementVNode("div", { + class: "selector-section", + style: {"flex":"1"} + }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.serviceTier')), 1 /* TEXT */) + ]), + _withDirectives(_createElementVNode("select", { + class: "model-select", + "onUpdate:modelValue": $event => ((_ctx.serviceTier) = $event), + onChange: _ctx.onServiceTierChange + }, [ + _createElementVNode("option", { value: "fast" }, _toDisplayString(_ctx.t('config.serviceTier.fast')), 1 /* TEXT */), + _createElementVNode("option", { value: "standard" }, _toDisplayString(_ctx.t('config.serviceTier.standard')), 1 /* TEXT */) + ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange"]), [ + [_vModelSelect, _ctx.serviceTier] + ]), + _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.serviceTier.hint', { field: 'service_tier' })), 1 /* TEXT */) + ]), + _createElementVNode("div", { + class: "selector-section", + style: {"flex":"1"} + }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.reasoningEffort')), 1 /* TEXT */) + ]), + _withDirectives(_createElementVNode("select", { + class: "model-select", + "onUpdate:modelValue": $event => ((_ctx.modelReasoningEffort) = $event), + onChange: _ctx.onReasoningEffortChange + }, [ + _createElementVNode("option", { value: "high" }, "high"), + _createElementVNode("option", { value: "medium" }, _toDisplayString(_ctx.t('config.reasoningEffort.medium')), 1 /* TEXT */), + _createElementVNode("option", { value: "low" }, "low"), + _createElementVNode("option", { value: "xhigh" }, "xhigh") + ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange"]), [ + [_vModelSelect, _ctx.modelReasoningEffort] + ]), + _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.reasoningEffort.hint')), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.contextBudget')), 1 /* TEXT */), + _createElementVNode("div", { class: "selector-actions" }, [ + _createElementVNode("button", { + class: "btn-tool btn-tool-compact", + onClick: _ctx.resetCodexContextBudgetDefaults, + disabled: _ctx.loading || !!_ctx.initError || _ctx.codexApplying + }, _toDisplayString(_ctx.t('config.reset')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + _createElementVNode("div", { class: "codex-config-grid" }, [ + _createElementVNode("div", { class: "form-group codex-config-field" }, [ + _createElementVNode("label", { + class: "form-label", + for: "codex-model-context-window" + }, "model_context_window"), + _withDirectives(_createElementVNode("input", { + id: "codex-model-context-window", + "onUpdate:modelValue": $event => ((_ctx.modelContextWindowInput) = $event), + class: "form-input", + inputmode: "numeric", + autocomplete: "off", + placeholder: _ctx.t('config.example', { value: 190000 }), + onFocus: $event => (_ctx.editingCodexBudgetField = 'modelContextWindowInput'), + onInput: $event => (_ctx.sanitizePositiveIntegerDraft('modelContextWindowInput')), + onBlur: _ctx.onModelContextWindowBlur, + onKeydown: _withKeys(_withModifiers(_ctx.onModelContextWindowBlur, ["prevent"]), ["enter"]) + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onFocus", "onInput", "onBlur", "onKeydown"]), [ + [_vModelText, _ctx.modelContextWindowInput] + ]), + _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('config.contextWindow.hint')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "form-group codex-config-field" }, [ + _createElementVNode("label", { + class: "form-label", + for: "codex-model-auto-compact-token-limit" + }, "model_auto_compact_token_limit"), + _withDirectives(_createElementVNode("input", { + id: "codex-model-auto-compact-token-limit", + "onUpdate:modelValue": $event => ((_ctx.modelAutoCompactTokenLimitInput) = $event), + class: "form-input", + inputmode: "numeric", + autocomplete: "off", + placeholder: _ctx.t('config.example', { value: 185000 }), + onFocus: $event => (_ctx.editingCodexBudgetField = 'modelAutoCompactTokenLimitInput'), + onInput: $event => (_ctx.sanitizePositiveIntegerDraft('modelAutoCompactTokenLimitInput')), + onBlur: _ctx.onModelAutoCompactTokenLimitBlur, + onKeydown: _withKeys(_withModifiers(_ctx.onModelAutoCompactTokenLimitBlur, ["prevent"]), ["enter"]) + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onFocus", "onInput", "onBlur", "onKeydown"]), [ + [_vModelText, _ctx.modelAutoCompactTokenLimitInput] + ]), + _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('config.autoCompact.hint')), 1 /* TEXT */) + ]) + ]) + ]), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.health.title')), 1 /* TEXT */) + ]), + _createElementVNode("button", { + class: "btn-tool", + onClick: _ctx.runHealthCheck, + disabled: _ctx.healthCheckLoading || _ctx.loading || !!_ctx.initError + }, _toDisplayString(_ctx.healthCheckLoading ? _ctx.t('config.health.running') : _ctx.t('config.health.run')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.health.hint')), 1 /* TEXT */) + ]) + ], 64 /* STABLE_FRAGMENT */)) + : _createCommentVNode("v-if", true), + (!_ctx.loading && !_ctx.initError) + ? (_openBlock(), _createElementBlock("div", { + key: 3, + class: "card-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.displayProvidersList, (provider) => { + return (_openBlock(), _createElementBlock("div", { + key: provider.name, + class: _normalizeClass(['card', { active: _ctx.displayCurrentProvider === provider.name, disabled: provider.name === 'local' && _ctx.isLocalProviderDisabled }]), + onClick: $event => ((provider.name === 'local' && _ctx.isLocalProviderDisabled) ? null : _ctx.switchProvider(provider.name)), + onKeydown: [ + _withKeys(_withModifiers($event => ((provider.name === 'local' && _ctx.isLocalProviderDisabled) ? null : _ctx.switchProvider(provider.name)), ["self","prevent"]), ["enter"]), + _withKeys(_withModifiers($event => ((provider.name === 'local' && _ctx.isLocalProviderDisabled) ? null : _ctx.switchProvider(provider.name)), ["self","prevent"]), ["space"]) + ], + tabindex: provider.name === 'local' && _ctx.isLocalProviderDisabled ? -1 : 0, + role: "button", + "aria-current": _ctx.displayCurrentProvider === provider.name ? 'true' : null + }, [ + _createElementVNode("div", { class: "card-leading" }, [ + _createElementVNode("div", { class: "card-icon" }, [ + _createTextVNode(_toDisplayString(provider.name.charAt(0).toUpperCase()), 1 /* TEXT */), + (_ctx.isTransformProvider(provider)) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: "card-icon-dot", + title: "通过内建转换适配" + })) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "card-content" }, [ + (provider.name === 'local') + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "bridge-pool-summary" + }, [ + (_openBlock(), _createElementBlock("svg", { + class: "bridge-pool-summary-icon", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + width: "12", + height: "12" + }, [ + _createElementVNode("circle", { + cx: "6", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "18", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "12", + cy: "18", + r: "2" + }), + _createElementVNode("path", { d: "M6 8v4h6v4" }), + _createElementVNode("path", { d: "M18 8v4h-6v4" }) + ])), + _createElementVNode("span", { class: "bridge-pool-summary-text" }, "已启用 " + _toDisplayString(_ctx.localBridgeCandidateProviders().filter(cp => !_ctx.isLocalBridgeExcluded(cp.name)).length) + " / " + _toDisplayString(_ctx.localBridgeCandidateProviders().length), 1 /* TEXT */) + ])) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "card-title" }, [ + _createElementVNode("span", null, _toDisplayString(provider.name), 1 /* TEXT */), + (provider.readOnly) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: "provider-readonly-badge" + }, _toDisplayString(_ctx.t('config.badge.system')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + (provider.name !== 'local') + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "card-subtitle card-subtitle-model" + }, _toDisplayString(_ctx.activeProviderModel(provider.name) || _ctx.t('config.model.unset')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (provider.name !== 'local') + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "card-subtitle card-subtitle-url" + }, _toDisplayString(_ctx.displayProviderUrl(provider) || _ctx.t('config.url.unset')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ]), + _createElementVNode("div", { class: "card-trailing" }, [ + (_ctx.speedResults[provider.name]) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: _normalizeClass(['latency', _ctx.speedResults[provider.name].ok ? 'ok' : 'error']) + }, _toDisplayString(_ctx.formatLatency(_ctx.speedResults[provider.name])), 3 /* TEXT, CLASS */)) + : _createCommentVNode("v-if", true), + _createElementVNode("span", { + class: _normalizeClass(['pill', _ctx.providerPillConfigured(provider) ? 'configured' : 'empty']) + }, _toDisplayString(_ctx.providerPillText(provider)), 3 /* TEXT, CLASS */), + _createElementVNode("div", { + class: "card-actions", + onClick: _withModifiers(() => {}, ["stop"]) + }, [ + (provider.name === 'local') + ? (_openBlock(), _createElementBlock("button", { + key: 0, + class: "card-action-btn bridge-pool-trigger", + onClick: $event => (_ctx.showCodexBridgePoolModal = true), + "aria-label": '轮询池设置', + title: '轮询池设置' + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("circle", { + cx: "6", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "18", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "12", + cy: "18", + r: "2" + }), + _createElementVNode("path", { d: "M6 8v4h6v4" }), + _createElementVNode("path", { d: "M18 8v4h-6v4" }) + ])) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + _createElementVNode("button", { + class: _normalizeClass(["card-action-btn", { loading: _ctx.speedLoading[provider.name] }]), + disabled: !!_ctx.speedLoading[provider.name], + onClick: $event => (_ctx.runSpeedTest(provider.name, { silent: true })), + "aria-label": _ctx.t('config.availabilityTestAria', { name: provider.name }), + title: _ctx.t('config.availabilityTest') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M13 2L3 14h9l-1 8 10-12h-9l1-8z" }) + ])) + ], 10 /* CLASS, PROPS */, ["disabled", "onClick", "aria-label", "title"]), + _createElementVNode("button", { + class: "card-action-btn", + disabled: !_ctx.shouldShowProviderEdit(provider), + onClick: $event => (_ctx.openEditModal(provider)), + "aria-label": _ctx.t('config.provider.edit.aria', { name: provider.name }), + title: _ctx.shouldShowProviderEdit(provider) ? _ctx.t('common.edit') : _ctx.t('common.notEditable') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" }), + _createElementVNode("path", { d: "M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" }) + ])) + ], 8 /* PROPS */, ["disabled", "onClick", "aria-label", "title"]), + (!provider.readOnly) + ? (_openBlock(), _createElementBlock("button", { + key: 1, + class: "card-action-btn", + onClick: $event => (_ctx.openCloneProviderModal(provider)), + "aria-label": _ctx.t('config.provider.clone.aria', { name: provider.name }), + title: _ctx.t('config.provider.clone') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("rect", { + x: "9", + y: "9", + width: "13", + height: "13", + rx: "2" + }), + _createElementVNode("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" }) + ])) + ], 8 /* PROPS */, ["onClick", "aria-label", "title"])) + : _createCommentVNode("v-if", true), + (!provider.readOnly) + ? (_openBlock(), _createElementBlock("button", { + key: 2, + class: _normalizeClass(["card-action-btn", { loading: _ctx.providerShareLoading[provider.name], disabled: !_ctx.shouldAllowProviderShare(provider) }]), + disabled: _ctx.providerShareLoading[provider.name] || !_ctx.shouldAllowProviderShare(provider), + onClick: $event => (_ctx.copyProviderShareCommand(provider)), + title: _ctx.shouldAllowProviderShare(provider) ? _ctx.t('config.shareCommand') : _ctx.t('config.shareDisabled'), + "aria-label": _ctx.t('config.shareCommand.aria') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7" }), + _createElementVNode("path", { d: "M16 6l-4-4-4 4" }), + _createElementVNode("path", { d: "M12 2v14" }) + ])) + ], 10 /* CLASS, PROPS */, ["disabled", "onClick", "title", "aria-label"])) + : _createCommentVNode("v-if", true), + (!provider.readOnly) + ? (_openBlock(), _createElementBlock("button", { + key: 3, + class: _normalizeClass(["card-action-btn delete", { disabled: !_ctx.shouldShowProviderDelete(provider) }]), + disabled: !_ctx.shouldShowProviderDelete(provider), + onClick: $event => (_ctx.deleteProvider(provider.name)), + "aria-label": _ctx.t('config.provider.delete.aria', { name: provider.name }), + title: _ctx.shouldShowProviderDelete(provider) ? _ctx.t('common.delete') : _ctx.t('common.notDeletable') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M3 6h18" }), + _createElementVNode("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }) + ])) + ], 10 /* CLASS, PROPS */, ["disabled", "onClick", "aria-label", "title"])) + : _createCommentVNode("v-if", true) + ], 8 /* PROPS */, ["onClick"]) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "tabindex", "aria-current"])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + : _createCommentVNode("v-if", true) + ], 64 /* STABLE_FRAGMENT */)) + ], 8 /* PROPS */, ["aria-labelledby"]), [ + [_vShow, _ctx.mainTab === 'config' && _ctx.isProviderConfigMode] + ]), + _createCommentVNode(" Claude Code 配置 "), + _withDirectives(_createElementVNode("div", { + class: "mode-content mode-cards", + id: "panel-config-claude", + role: "tabpanel", + "aria-labelledby": _ctx.forceCompactLayout ? 'tab-config' : 'side-tab-config-claude' + }, [ + (_ctx.forceCompactLayout && !_ctx.sessionStandalone) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "segmented-control" + }, [ + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]), + onClick: $event => (_ctx.switchConfigMode('codex')) + }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]), + onClick: $event => (_ctx.switchConfigMode('claude')) + }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]), + onClick: $event => (_ctx.switchConfigMode('openclaw')) + }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]) + ])) + : _createCommentVNode("v-if", true), + (_ctx.shouldShowCliInstallPlaceholder('claude')) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "selector-section" + }, [ + _createElementVNode("div", { class: "empty-state" }, [ + _createElementVNode("div", { class: "empty-state-title" }, _toDisplayString(_ctx.t('cli.missing.title', { name: 'Claude' })), 1 /* TEXT */), + _createElementVNode("div", { class: "empty-state-subtitle" }, _toDisplayString(_ctx.t('cli.missing.subtitle', { name: 'Claude' })), 1 /* TEXT */), + _createElementVNode("div", { class: "docs-command-row" }, [ + _createElementVNode("div", { + class: "docs-command-box", + role: "group", + "aria-label": _ctx.t('cli.missing.commandAria', { name: 'Claude' }) + }, [ + _createElementVNode("code", { class: "install-command" }, _toDisplayString(_ctx.getInstallCommand('claude', 'install')), 1 /* TEXT */), + _createElementVNode("button", { + type: "button", + class: "btn-mini docs-copy-btn", + disabled: !_ctx.getInstallCommand('claude', 'install'), + onClick: $event => (_ctx.copyInstallCommand(_ctx.getInstallCommand('claude', 'install'))) + }, _toDisplayString(_ctx.t('common.copy')), 9 /* TEXT, PROPS */, ["disabled", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]) + ]), + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => {_ctx.mainTab = 'docs'; _ctx.setInstallCommandAction('install')} + }, _toDisplayString(_ctx.t('cli.missing.openDocs')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ])) + : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [ + (!_ctx.loading && !_ctx.initError) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + class: "btn-add", + onClick: _ctx.openClaudeConfigModal + }, [ + (_openBlock(), _createElementBlock("svg", { + class: "icon", + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M10 4v12M4 10h12" }) + ])), + _createTextVNode(" " + _toDisplayString(_ctx.t('claude.addProvider')), 1 /* TEXT */) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('claude.applyDefault')), 1 /* TEXT */), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('claude.presetProviders')), 1 /* TEXT */) + ]), + _createElementVNode("div", { + class: "btn-group", + style: {"flex-wrap":"wrap","gap":"8px","margin-top":"0"} + }, [ + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'Claude Official'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.anthropic.com'; _ctx.newClaudeConfig.model = 'claude-sonnet-4'; _ctx.showClaudeConfigModal = true} + }, "Claude Official", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'DeepSeek'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.deepseek.com/anthropic'; _ctx.newClaudeConfig.model = 'DeepSeek-V3.2'; _ctx.showClaudeConfigModal = true} + }, "DeepSeek", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'Zhipu GLM'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://open.bigmodel.cn/api/anthropic'; _ctx.newClaudeConfig.model = 'glm-5'; _ctx.showClaudeConfigModal = true} + }, "Zhipu GLM", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'Z.ai GLM'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.z.ai/api/anthropic'; _ctx.newClaudeConfig.model = 'glm-5'; _ctx.showClaudeConfigModal = true} + }, "Z.ai GLM", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'Qwen Coder'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://coding.dashscope.aliyuncs.com/apps/anthropic'; _ctx.newClaudeConfig.model = 'qwen3-coder'; _ctx.showClaudeConfigModal = true} + }, "Qwen Coder", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'Kimi k2'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.moonshot.cn/anthropic'; _ctx.newClaudeConfig.model = 'kimi-k2.5'; _ctx.showClaudeConfigModal = true} + }, "Kimi k2", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'Kimi For Coding'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.kimi.com/coding/'; _ctx.newClaudeConfig.model = 'kimi-k2.5'; _ctx.showClaudeConfigModal = true} + }, "Kimi For Coding", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'KAT-Coder'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/claude-code-proxy'; _ctx.newClaudeConfig.model = 'KAT-Coder-Pro V1'; _ctx.showClaudeConfigModal = true} + }, "KAT-Coder", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'Longcat'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.longcat.chat/anthropic'; _ctx.newClaudeConfig.model = 'LongCat-Flash-Chat'; _ctx.showClaudeConfigModal = true} + }, "Longcat", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'MiniMax'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.minimaxi.com/anthropic'; _ctx.newClaudeConfig.model = 'MiniMax-M2.7'; _ctx.showClaudeConfigModal = true} + }, "MiniMax", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'MiniMax en'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.minimax.io/anthropic'; _ctx.newClaudeConfig.model = 'MiniMax-M2.7'; _ctx.showClaudeConfigModal = true} + }, "MiniMax en", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'DouBaoSeed'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://ark.cn-beijing.volces.com/api/coding'; _ctx.newClaudeConfig.model = 'doubao-seed-2-0-code-preview-latest'; _ctx.showClaudeConfigModal = true} + }, "DouBaoSeed", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'BaiLing'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.tbox.cn/api/anthropic'; _ctx.newClaudeConfig.model = 'Ling-2.5-1T'; _ctx.showClaudeConfigModal = true} + }, "BaiLing", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'ModelScope'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api-inference.modelscope.cn'; _ctx.newClaudeConfig.model = 'ZhipuAI/GLM-5'; _ctx.showClaudeConfigModal = true} + }, "ModelScope", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'AiHubMix'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://aihubmix.com'; _ctx.newClaudeConfig.model = 'glm-4.7'; _ctx.showClaudeConfigModal = true} + }, "AiHubMix", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'DMXAPI'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://www.dmxapi.cn'; _ctx.newClaudeConfig.model = 'glm-4.7'; _ctx.showClaudeConfigModal = true} + }, "DMXAPI", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'PackyCode'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://www.packyapi.com'; _ctx.newClaudeConfig.model = 'glm-4.7'; _ctx.showClaudeConfigModal = true} + }, "PackyCode", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'AnyRouter'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://anyrouter.top'; _ctx.newClaudeConfig.model = 'claude-opus-4-7[1m]'; _ctx.showClaudeConfigModal = true} + }, "AnyRouter", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'Xiaomi MiMo'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.xiaomimimo.com/anthropic'; _ctx.newClaudeConfig.model = 'mimo-v2.5-pro'; _ctx.showClaudeConfigModal = true} + }, "Xiaomi MiMo", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => {_ctx.newClaudeConfig.name = 'Xiaomi Token Plan'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://token-plan-cn.xiaomimimo.com/anthropic'; _ctx.newClaudeConfig.model = 'mimo-v2.5-pro'; _ctx.showClaudeConfigModal = true} + }, "Xiaomi Token Plan", 8 /* PROPS */, ["onClick"]) + ]) + ]), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('claude.model')), 1 /* TEXT */) + ]), + (_ctx.claudeModelHasList) + ? _withDirectives((_openBlock(), _createElementBlock("input", { + key: 0, + class: "model-input", + "onUpdate:modelValue": $event => ((_ctx.currentClaudeModel) = $event), + onChange: _ctx.onClaudeModelChange, + onBlur: _ctx.onClaudeModelChange, + onKeyup: _withKeys(_ctx.onClaudeModelChange, ["enter"]), + placeholder: _ctx.t('claude.model.placeholder'), + readonly: _ctx.currentClaudeConfig === 'claude-local', + list: "claude-model-options" + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange", "onBlur", "onKeyup", "placeholder", "readonly"])), [ + [_vModelText, _ctx.currentClaudeModel] + ]) + : _createCommentVNode("v-if", true), + (_ctx.claudeModelHasList) + ? (_openBlock(), _createElementBlock("datalist", { + key: 1, + id: "claude-model-options" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.claudeModelOptions, (model) => { + return (_openBlock(), _createElementBlock("option", { + key: model, + value: model + }, null, 8 /* PROPS */, ["value"])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + : _withDirectives((_openBlock(), _createElementBlock("input", { + key: 2, + class: "model-input", + "onUpdate:modelValue": $event => ((_ctx.currentClaudeModel) = $event), + onBlur: _ctx.onClaudeModelChange, + onKeyup: _withKeys(_ctx.onClaudeModelChange, ["enter"]), + placeholder: _ctx.t('claude.model.placeholder'), + readonly: _ctx.currentClaudeConfig === 'claude-local' + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur", "onKeyup", "placeholder", "readonly"])), [ + [_vModelText, _ctx.currentClaudeModel] + ]), + _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('claude.model.hint')), 1 /* TEXT */), + _createElementVNode("button", { + class: "btn-tool btn-template-editor", + onClick: _ctx.openClaudeConfigTemplateEditor, + disabled: _ctx.loading || !!_ctx.initError + }, _toDisplayString(_ctx.t('config.template.openEditor')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, "CLAUDE.md") + ]), + _createElementVNode("button", { + class: "btn-tool", + onClick: _ctx.openClaudeMdEditor, + disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading + }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('claude.md.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('claude.md.hint')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.health.title')), 1 /* TEXT */) + ]), + _createElementVNode("button", { + class: "btn-tool", + onClick: _ctx.runHealthCheck, + disabled: _ctx.healthCheckLoading || _ctx.loading || !!_ctx.initError + }, _toDisplayString(_ctx.healthCheckLoading ? _ctx.t('config.health.running') : _ctx.t('config.health.run')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.health.hint')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "card-list" }, [ + _createElementVNode("div", { + class: _normalizeClass(['card', { active: _ctx.currentClaudeConfig === 'claude-local', disabled: _ctx.isClaudeLocalBridgeDisabled() }]), + onClick: $event => (_ctx.isClaudeLocalBridgeDisabled() ? null : _ctx.applyClaudeLocalBridge()), + onKeydown: [ + _withKeys(_withModifiers($event => (_ctx.isClaudeLocalBridgeDisabled() ? null : _ctx.applyClaudeLocalBridge()), ["self","prevent"]), ["enter"]), + _withKeys(_withModifiers($event => (_ctx.isClaudeLocalBridgeDisabled() ? null : _ctx.applyClaudeLocalBridge()), ["self","prevent"]), ["space"]) + ], + tabindex: _ctx.isClaudeLocalBridgeDisabled() ? -1 : 0, + role: "button", + "aria-current": _ctx.currentClaudeConfig === 'claude-local' ? 'true' : null + }, [ + _createElementVNode("div", { class: "card-leading" }, [ + _createElementVNode("div", { class: "card-icon" }, "L"), + _createElementVNode("div", { class: "card-content" }, [ + _createElementVNode("div", { class: "bridge-pool-summary" }, [ + (_openBlock(), _createElementBlock("svg", { + class: "bridge-pool-summary-icon", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + width: "12", + height: "12" + }, [ + _createElementVNode("circle", { + cx: "6", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "18", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "12", + cy: "18", + r: "2" + }), + _createElementVNode("path", { d: "M6 8v4h6v4" }), + _createElementVNode("path", { d: "M18 8v4h-6v4" }) + ])), + _createElementVNode("span", { class: "bridge-pool-summary-text" }, _toDisplayString(_ctx.t('claude.localBridge.enabled')) + " " + _toDisplayString(_ctx.claudeLocalBridgeCandidateProviders().filter(cp => !_ctx.isClaudeLocalBridgeExcluded(cp.name)).length) + " / " + _toDisplayString(_ctx.claudeLocalBridgeCandidateProviders().length), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "card-title" }, [ + _createElementVNode("span", null, "local"), + _createElementVNode("span", { class: "provider-readonly-badge" }, _toDisplayString(_ctx.t('config.badge.system')), 1 /* TEXT */) + ]) + ]) + ]), + _createElementVNode("div", { class: "card-trailing" }, [ + _createElementVNode("span", { + class: _normalizeClass(['pill', _ctx.claudeLocalBridgeConfigured() ? 'configured' : 'empty']) + }, _toDisplayString(_ctx.claudeLocalBridgeConfigured() ? _ctx.t('claude.configured') : _ctx.t('claude.notConfigured')), 3 /* TEXT, CLASS */), + _createElementVNode("div", { + class: "card-actions", + onClick: _withModifiers(() => {}, ["stop"]) + }, [ + _createElementVNode("button", { + class: "card-action-btn bridge-pool-trigger", + onClick: $event => (_ctx.showClaudeBridgePoolModal = true), + "aria-label": _ctx.t('claude.localBridge.poolTitle'), + title: _ctx.t('claude.localBridge.poolTitle') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("circle", { + cx: "6", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "18", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "12", + cy: "18", + r: "2" + }), + _createElementVNode("path", { d: "M6 8v4h6v4" }), + _createElementVNode("path", { d: "M18 8v4h-6v4" }) + ])) + ], 8 /* PROPS */, ["onClick", "aria-label", "title"]) + ], 8 /* PROPS */, ["onClick"]) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "tabindex", "aria-current"]), + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.claudeConfigs, (config, name) => { + return (_openBlock(), _createElementBlock("div", { + key: name, + class: _normalizeClass(['card', { active: _ctx.currentClaudeConfig === name }]), + onClick: $event => (_ctx.applyClaudeConfig(name)), + onKeydown: [ + _withKeys(_withModifiers($event => (_ctx.applyClaudeConfig(name)), ["self","prevent"]), ["enter"]), + _withKeys(_withModifiers($event => (_ctx.applyClaudeConfig(name)), ["self","prevent"]), ["space"]) + ], + tabindex: "0", + role: "button", + "aria-current": _ctx.currentClaudeConfig === name ? 'true' : null + }, [ + _createElementVNode("div", { class: "card-leading" }, [ + _createElementVNode("div", { class: "card-icon" }, _toDisplayString(name.charAt(0).toUpperCase()), 1 /* TEXT */), + _createElementVNode("div", { class: "card-content" }, [ + _createElementVNode("div", { class: "card-title" }, _toDisplayString(name), 1 /* TEXT */), + _createElementVNode("div", { class: "card-subtitle card-subtitle-model" }, _toDisplayString(config.model || _ctx.t('claude.model.unset')), 1 /* TEXT */), + (config.baseUrl) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "card-subtitle card-subtitle-url" + }, _toDisplayString(config.baseUrl), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ]), + _createElementVNode("div", { class: "card-trailing" }, [ + (_ctx.claudeSpeedResults[name]) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: _normalizeClass(['latency', _ctx.claudeSpeedResults[name].ok ? 'ok' : 'error']) + }, _toDisplayString(_ctx.formatLatency(_ctx.claudeSpeedResults[name])), 3 /* TEXT, CLASS */)) + : _createCommentVNode("v-if", true), + _createElementVNode("span", { + class: _normalizeClass(['pill', config.hasKey ? 'configured' : 'empty']) + }, _toDisplayString(config.hasKey ? _ctx.t('claude.configured') : _ctx.t('claude.notConfigured')), 3 /* TEXT, CLASS */), + _createElementVNode("div", { + class: "card-actions", + onClick: _withModifiers(() => {}, ["stop"]) + }, [ + _createElementVNode("button", { + class: "card-action-btn", + onClick: $event => (_ctx.openEditConfigModal(name)), + "aria-label": _ctx.t('claude.action.editAria', { name }), + title: _ctx.t('claude.action.edit') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" }), + _createElementVNode("path", { d: "M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" }) + ])) + ], 8 /* PROPS */, ["onClick", "aria-label", "title"]), + _createElementVNode("button", { + class: "card-action-btn", + onClick: $event => (_ctx.openCloneClaudeConfigModal(name, config)), + "aria-label": _ctx.t('claude.action.cloneAria', { name }), + title: _ctx.t('claude.action.clone') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("rect", { + x: "9", + y: "9", + width: "13", + height: "13", + rx: "2" + }), + _createElementVNode("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" }) + ])) + ], 8 /* PROPS */, ["onClick", "aria-label", "title"]), + _createElementVNode("button", { + class: _normalizeClass(["card-action-btn", { loading: _ctx.claudeShareLoading[name] }]), + onClick: $event => (_ctx.copyClaudeShareCommand(name)), + title: _ctx.t('config.shareCommand'), + "aria-label": _ctx.t('config.shareCommand.aria') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7" }), + _createElementVNode("path", { d: "M16 6l-4-4-4 4" }), + _createElementVNode("path", { d: "M12 2v14" }) + ])) + ], 10 /* CLASS, PROPS */, ["onClick", "title", "aria-label"]), + _createElementVNode("button", { + class: "card-action-btn delete", + onClick: $event => (_ctx.deleteClaudeConfig(name)), + "aria-label": _ctx.t('claude.action.deleteAria', { name }), + title: _ctx.t('claude.action.delete') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M3 6h18" }), + _createElementVNode("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }) + ])) + ], 8 /* PROPS */, ["onClick", "aria-label", "title"]) + ], 8 /* PROPS */, ["onClick"]) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "aria-current"])) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ], 64 /* STABLE_FRAGMENT */)) + ], 8 /* PROPS */, ["aria-labelledby"]), [ + [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'claude'] + ]), + _createCommentVNode(" OpenClaw 配置模式 "), + _withDirectives(_createElementVNode("div", { + class: "mode-content mode-cards", + id: "panel-config-openclaw", + role: "tabpanel", + "aria-labelledby": _ctx.forceCompactLayout ? 'tab-config' : 'side-tab-config-openclaw' + }, [ + (_ctx.forceCompactLayout && !_ctx.sessionStandalone) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "segmented-control" + }, [ + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]), + onClick: $event => (_ctx.switchConfigMode('codex')) + }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]), + onClick: $event => (_ctx.switchConfigMode('claude')) + }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]), + onClick: $event => (_ctx.switchConfigMode('openclaw')) + }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]) + ])) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('openclaw.applyHint')), 1 /* TEXT */), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, "AGENTS.md") + ]), + _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('openclaw.agents.hint')), 1 /* TEXT */), + _createElementVNode("button", { + class: "btn-tool", + onClick: _ctx.openOpenclawAgentsEditor, + disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading + }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('openclaw.agents.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("label", { + class: "selector-title", + for: "openclaw-workspace-file" + }, _toDisplayString(_ctx.t('openclaw.workspaceFile')), 1 /* TEXT */) + ]), + _withDirectives(_createElementVNode("input", { + id: "openclaw-workspace-file", + class: "form-input", + "onUpdate:modelValue": $event => ((_ctx.openclawWorkspaceFileName) = $event), + placeholder: _ctx.t('openclaw.workspace.placeholder') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.openclawWorkspaceFileName] + ]), + _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('openclaw.workspace.hint')), 1 /* TEXT */), + _createElementVNode("button", { + class: "btn-tool", + onClick: _ctx.openOpenclawWorkspaceEditor, + disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading + }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('openclaw.workspace.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]), + _createElementVNode("div", { class: "card-list" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.openclawConfigs, (config, name) => { + return (_openBlock(), _createElementBlock("div", { + key: name, + class: _normalizeClass(['card', { active: _ctx.currentOpenclawConfig === name }]), + onClick: $event => (_ctx.applyOpenclawConfig(name)), + onKeydown: [ + _withKeys(_withModifiers($event => (_ctx.applyOpenclawConfig(name)), ["self","prevent"]), ["enter"]), + _withKeys(_withModifiers($event => (_ctx.applyOpenclawConfig(name)), ["self","prevent"]), ["space"]) + ], + tabindex: "0", + role: "button", + "aria-current": _ctx.currentOpenclawConfig === name ? 'true' : null + }, [ + _createElementVNode("div", { class: "card-leading" }, [ + _createElementVNode("div", { class: "card-icon" }, _toDisplayString(name.charAt(0).toUpperCase()), 1 /* TEXT */), + _createElementVNode("div", { class: "card-content" }, [ + _createElementVNode("div", { class: "card-title" }, _toDisplayString(name), 1 /* TEXT */), + _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString(_ctx.openclawSubtitle(config)), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "card-trailing" }, [ + _createElementVNode("span", { + class: _normalizeClass(['pill', _ctx.openclawHasContent(config) ? 'configured' : 'empty']) + }, _toDisplayString(_ctx.openclawHasContent(config) ? _ctx.t('openclaw.configured') : _ctx.t('openclaw.notConfigured')), 3 /* TEXT, CLASS */), + _createElementVNode("div", { + class: "card-actions", + onClick: _withModifiers(() => {}, ["stop"]) + }, [ + _createElementVNode("button", { + class: "card-action-btn", + onClick: $event => (_ctx.openOpenclawEditModal(name)), + "aria-label": _ctx.t('openclaw.action.editAria', { name }), + title: _ctx.t('openclaw.action.edit') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" }), + _createElementVNode("path", { d: "M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" }) + ])) + ], 8 /* PROPS */, ["onClick", "aria-label", "title"]), + (name !== '默认配置') + ? (_openBlock(), _createElementBlock("button", { + key: 0, + class: "card-action-btn delete", + onClick: $event => (_ctx.deleteOpenclawConfig(name)), + "aria-label": _ctx.t('openclaw.action.deleteAria', { name }), + title: _ctx.t('openclaw.action.delete') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M3 6h18" }), + _createElementVNode("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }) + ])) + ], 8 /* PROPS */, ["onClick", "aria-label", "title"])) + : _createCommentVNode("v-if", true) + ], 8 /* PROPS */, ["onClick"]) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "aria-current"])) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ], 8 /* PROPS */, ["aria-labelledby"]), [ + [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'openclaw'] + ]), + _createCommentVNode(" 会话浏览模式 "), + _withDirectives(_createElementVNode("div", { + class: "mode-content", + id: "panel-sessions", + role: "tabpanel", + "aria-labelledby": 'tab-sessions' + }, [ + (_ctx.sessionStandalone) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "session-standalone-page" + }, [ + (_ctx.sessionStandaloneLoading) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "state-message" + }, _toDisplayString(_ctx.t('sessions.loading')), 1 /* TEXT */)) + : (_ctx.sessionStandaloneError) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "state-message error" + }, _toDisplayString(_ctx.sessionStandaloneError), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { key: 2 }, [ + _createElementVNode("div", { class: "session-standalone-title" }, [ + _createTextVNode(_toDisplayString(_ctx.sessionStandaloneTitle) + " ", 1 /* TEXT */), + (_ctx.sessionStandaloneSourceLabel) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, " · " + _toDisplayString(_ctx.sessionStandaloneSourceLabel), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("pre", { class: "session-standalone-text" }, _toDisplayString(_ctx.sessionStandaloneText), 1 /* TEXT */) + ])) + ])) + : (_openBlock(), _createElementBlock("div", { key: 1 }, [ + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { + class: "selector-header", + style: {"display":"none"} + }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('sessions.sourceTitle')), 1 /* TEXT */), + _createElementVNode("div", { class: "selector-actions sessions-header-actions" }) + ]), + _createElementVNode("div", { class: "session-toolbar" }, [ + _createElementVNode("div", { class: "session-toolbar-group session-toolbar-primary" }, [ + _createElementVNode("div", { + class: "session-source-pills", + role: "radiogroup", + "aria-label": "Session source" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionSourceOptions, (src) => { + return (_openBlock(), _createElementBlock("button", { + key: src.value, + class: _normalizeClass(['session-source-pill', { active: _ctx.sessionFilterSource === src.value }]), + "data-source": src.value, + onClick: $event => (_ctx.setSessionSource(src.value)), + disabled: _ctx.sessionsLoading, + "aria-pressed": _ctx.sessionFilterSource === src.value, + role: "radio", + type: "button" + }, [ + _createElementVNode("span", { class: "session-source-pill-dot" }), + _createElementVNode("span", { class: "session-source-pill-label" }, _toDisplayString(src.label), 1 /* TEXT */) + ], 10 /* CLASS, PROPS */, ["data-source", "onClick", "disabled", "aria-pressed"])) + }), 128 /* KEYED_FRAGMENT */)) + ]), + _withDirectives(_createElementVNode("select", { + class: "session-path-select", + "onUpdate:modelValue": $event => ((_ctx.sessionPathFilter) = $event), + onChange: _ctx.onSessionPathFilterChange, + onFocus: $event => (_ctx.loadSessionPathOptions({ source: _ctx.sessionFilterSource })), + disabled: _ctx.sessionsLoading + }, [ + _createElementVNode("option", { value: "" }, _toDisplayString(_ctx.t('sessions.allPaths')), 1 /* TEXT */), + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionPathOptions, (cwd) => { + return (_openBlock(), _createElementBlock("option", { + key: cwd, + value: cwd + }, _toDisplayString(cwd), 9 /* TEXT, PROPS */, ["value"])) + }), 128 /* KEYED_FRAGMENT */)) + ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange", "onFocus", "disabled"]), [ + [_vModelSelect, _ctx.sessionPathFilter] + ]) + ]), + _createElementVNode("div", { class: "session-toolbar-group session-toolbar-grow" }, [ + _withDirectives(_createElementVNode("input", { + class: "session-query-input", + "onUpdate:modelValue": $event => ((_ctx.sessionQuery) = $event), + onKeyup: _withKeys(_ctx.onSessionFilterChange, ["enter"]), + disabled: _ctx.sessionsLoading || !_ctx.isSessionQueryEnabled, + placeholder: _ctx.sessionQueryPlaceholder + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onKeyup", "disabled", "placeholder"]), [ + [_vModelText, _ctx.sessionQuery] + ]) + ]), + _createElementVNode("div", { class: "session-toolbar-group session-toolbar-secondary" }, [ + _withDirectives(_createElementVNode("select", { + class: "session-role-select", + "onUpdate:modelValue": $event => ((_ctx.sessionRoleFilter) = $event), + onChange: _ctx.onSessionFilterChange, + disabled: _ctx.sessionsLoading + }, [ + _createElementVNode("option", { value: "all" }, _toDisplayString(_ctx.t('sessions.role.all')), 1 /* TEXT */), + _createElementVNode("option", { value: "user" }, _toDisplayString(_ctx.t('sessions.role.user')), 1 /* TEXT */), + _createElementVNode("option", { value: "assistant" }, _toDisplayString(_ctx.t('sessions.role.assistant')), 1 /* TEXT */), + _createElementVNode("option", { value: "system" }, _toDisplayString(_ctx.t('sessions.role.system')), 1 /* TEXT */) + ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange", "disabled"]), [ + [_vModelSelect, _ctx.sessionRoleFilter] + ]), + _withDirectives(_createElementVNode("select", { + class: "session-time-select", + "onUpdate:modelValue": $event => ((_ctx.sessionTimePreset) = $event), + onChange: _ctx.onSessionFilterChange, + disabled: _ctx.sessionsLoading + }, [ + _createElementVNode("option", { value: "all" }, _toDisplayString(_ctx.t('sessions.time.all')), 1 /* TEXT */), + _createElementVNode("option", { value: "7d" }, _toDisplayString(_ctx.t('sessions.time.7d')), 1 /* TEXT */), + _createElementVNode("option", { value: "30d" }, _toDisplayString(_ctx.t('sessions.time.30d')), 1 /* TEXT */), + _createElementVNode("option", { value: "90d" }, _toDisplayString(_ctx.t('sessions.time.90d')), 1 /* TEXT */) + ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange", "disabled"]), [ + [_vModelSelect, _ctx.sessionTimePreset] + ]), + _withDirectives(_createElementVNode("select", { + class: "session-time-select", + "onUpdate:modelValue": $event => ((_ctx.sessionSortMode) = $event), + onChange: _ctx.onSessionSortChange, + disabled: _ctx.sessionsLoading + }, [ + _createElementVNode("option", { value: "time" }, _toDisplayString(_ctx.t('sessions.sort.time')), 1 /* TEXT */), + _createElementVNode("option", { value: "hot" }, _toDisplayString(_ctx.t('sessions.sort.hot')), 1 /* TEXT */) + ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange", "disabled"]), [ + [_vModelSelect, _ctx.sessionSortMode] + ]), + _createElementVNode("button", { + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.loadSessions({ forceRefresh: true })), + disabled: _ctx.sessionsLoading, + title: _ctx.t('sessions.refresh') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + class: "btn-icon-sm" + }, [ + _createElementVNode("path", { d: "M21 2v6h-6M3 12a9 9 0 0 1 15-6.7L21 8M3 22v-6h6M21 12a9 9 0 0 1-15 6.7L3 16" }) + ])) + ], 8 /* PROPS */, ["onClick", "disabled", "title"]), + _createElementVNode("button", { + class: "btn-tool btn-tool-compact", + type: "button", + onClick: $event => (_ctx.switchMainTab('dashboard')), + title: _ctx.t('dashboard.doctor.title') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + class: "btn-icon-sm" + }, [ + _createElementVNode("path", { d: "M22 12h-4l-3 9L9 3l-3 9H2" }) + ])) + ], 8 /* PROPS */, ["onClick", "title"]), + _createElementVNode("button", { + class: "btn-tool btn-tool-compact", + type: "button", + onClick: _ctx.copySessionsFilterShareUrl, + disabled: _ctx.sessionsLoading + }, _toDisplayString(_ctx.t('sessions.filters.copyLink')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + class: "btn-tool btn-tool-compact", + type: "button", + onClick: _ctx.clearSessionFilters, + disabled: _ctx.sessionsLoading + }, _toDisplayString(_ctx.t('common.resetFilters')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + (_ctx.hasActiveSessionFilters()) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "session-filter-chips", + "aria-label": _ctx.t('sessions.filters.copyLink') + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getSessionFilterChips(), (chip) => { + return (_openBlock(), _createElementBlock("button", { + key: 'chip-' + chip.key, + type: "button", + class: "session-filter-chip", + onClick: $event => (_ctx.clearSessionFilterChip(chip.key)), + title: `${chip.title}: ${chip.value}` + }, [ + _createElementVNode("span", { class: "session-filter-chip-title" }, _toDisplayString(chip.title), 1 /* TEXT */), + _createElementVNode("span", { class: "session-filter-chip-value" }, _toDisplayString(chip.value), 1 /* TEXT */), + _createElementVNode("span", { class: "session-filter-chip-close" }, "×") + ], 8 /* PROPS */, ["onClick", "title"])) + }), 128 /* KEYED_FRAGMENT */)) + ], 8 /* PROPS */, ["aria-label"])) + : _createCommentVNode("v-if", true) + ]), + (_ctx.sessionsLoading) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "state-message" + }, _toDisplayString(_ctx.t('sessions.loadingList')), 1 /* TEXT */)) + : (_ctx.sessionsList.length === 0) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "session-empty" + }, _toDisplayString(_ctx.t('sessions.empty')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 2, + class: "session-layout" + }, [ + (_ctx.sessionListRenderEnabled) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "session-list", + ref: _ctx.setSessionListRef, + onScrollPassive: _ctx.onSessionListScroll + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.visibleSessionsList, (session, __, ___, _cached) => { + const _memo = ([_ctx.activeSessionExportKey === _ctx.getSessionExportKey(session), session.messageCount, session.updatedAt, session.title, session.sourceLabel, session.cwd, _ctx.isSessionPinned(session), _ctx.sessionsLoading, session.match && session.match.count]) + if (_cached && _cached.key === session.source + '-' + session.sessionId + '-' + session.filePath && _isMemoSame(_cached, _memo)) return _cached + const _item = (_openBlock(), _createElementBlock("div", { + key: session.source + '-' + session.sessionId + '-' + session.filePath, + class: _normalizeClass([ + 'session-item', + { + active: _ctx.activeSessionExportKey === _ctx.getSessionExportKey(session), + pinned: _ctx.isSessionPinned(session) + } + ]), + onClick: $event => (_ctx.selectSession(session)), + onKeydown: [ + _withKeys(_withModifiers($event => (_ctx.selectSession(session)), ["self","prevent"]), ["enter"]), + _withKeys(_withModifiers($event => (_ctx.selectSession(session)), ["self","prevent"]), ["space"]) + ], + tabindex: "0", + role: "button", + "aria-current": _ctx.activeSessionExportKey === _ctx.getSessionExportKey(session) ? 'true' : null + }, [ + _createElementVNode("div", { class: "session-item-header" }, [ + _createElementVNode("div", { class: "session-item-main" }, [ + _createElementVNode("div", { class: "session-item-title" }, _toDisplayString(session.title || session.sessionId), 1 /* TEXT */), + _createElementVNode("span", { class: "session-count-badge" }, _toDisplayString(session.messageCount == null ? '...' : session.messageCount), 1 /* TEXT */), + (session.match && session.match.hit) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: "session-match-badge" + }, _toDisplayString(session.match.count), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.sessionContextUtilization[_ctx.getSessionExportKey(session)] && _ctx.sessionContextUtilization[_ctx.getSessionExportKey(session)].percent > 0) + ? (_openBlock(), _createElementBlock("span", { + key: 1, + class: _normalizeClass(['session-context-badge', 'session-context-' + _ctx.sessionContextUtilization[_ctx.getSessionExportKey(session)].level]), + title: 'Context: ' + _ctx.sessionContextUtilization[_ctx.getSessionExportKey(session)].percent + '%' + }, _toDisplayString(_ctx.sessionContextUtilization[_ctx.getSessionExportKey(session)].percent) + "% ", 11 /* TEXT, CLASS, PROPS */, ["title"])) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "session-item-actions" }, [ + _createElementVNode("button", { + class: "session-item-copy session-item-pin", + onClick: _withModifiers($event => (_ctx.toggleSessionPin(session)), ["stop"]), + disabled: _ctx.sessionsLoading, + "aria-label": _ctx.isSessionPinned(session) ? _ctx.t('sessions.unpin') : _ctx.t('sessions.pin'), + title: _ctx.isSessionPinned(session) ? _ctx.t('sessions.unpin') : _ctx.t('sessions.pin'), + "aria-pressed": _ctx.isSessionPinned(session) + }, [ + (_ctx.isSessionPinned(session)) + ? (_openBlock(), _createElementBlock("svg", { + key: 0, + class: "pin-icon", + viewBox: "0 0 24 24", + fill: "currentColor", + stroke: "currentColor", + "stroke-width": "1.6" + }, [ + _createElementVNode("path", { d: "M12 22s8-6 8-12a8 8 0 1 0-16 0c0 6 8 12 8 12z" }) + ])) + : (_openBlock(), _createElementBlock("svg", { + key: 1, + class: "pin-icon", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.6" + }, [ + _createElementVNode("path", { d: "M12 22s8-6 8-12a8 8 0 1 0-16 0c0 6 8 12 8 12z" }) + ])) + ], 8 /* PROPS */, ["onClick", "disabled", "aria-label", "title", "aria-pressed"]), + (_ctx.isResumeCommandAvailable(session)) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + class: "session-item-copy", + onClick: _withModifiers($event => (_ctx.copyResumeCommand(session)), ["stop"]), + disabled: _ctx.sessionsLoading, + "aria-label": _ctx.getResumeCommandTitle(session), + title: _ctx.getResumeCommandTitle(session) + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("rect", { + x: "8", + y: "8", + width: "12", + height: "12", + rx: "2" + }), + _createElementVNode("path", { d: "M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2" }) + ])) + ], 8 /* PROPS */, ["onClick", "disabled", "aria-label", "title"])) + : _createCommentVNode("v-if", true) + ]) + ]), + _createElementVNode("div", { class: "session-item-meta" }, [ + _createElementVNode("span", { + class: "session-source", + "data-source": session.source + }, _toDisplayString(session.sourceLabel), 9 /* TEXT, PROPS */, ["data-source"]), + _createElementVNode("span", { class: "session-item-time" }, _toDisplayString(session.updatedAt || _ctx.t('sessions.unknownTime')), 1 /* TEXT */), + (_ctx.getSessionHotLabel(session)) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: "session-item-hot" + }, _toDisplayString(_ctx.getSessionHotLabel(session)), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (session.cwd) + ? (_openBlock(), _createElementBlock("span", { + key: 1, + class: "session-item-cwd session-item-sub" + }, _toDisplayString(session.cwd), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (session.match && session.match.snippets && session.match.snippets.length) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "session-match-snippets" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(session.match.snippets.slice(0, 2), (snip, si) => { + return (_openBlock(), _createElementBlock("div", { + key: si, + class: "session-match-snippet" + }, _toDisplayString(snip), 1 /* TEXT */)) + }), 128 /* KEYED_FRAGMENT */)) + ])) + : _createCommentVNode("v-if", true) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "aria-current"])) + _item.memo = _memo + return _item + }, _cache, 0), 128 /* KEYED_FRAGMENT */)) + ], 40 /* PROPS, NEED_HYDRATION */, ["onScrollPassive"])) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "session-list session-list-placeholder" + })), + _createElementVNode("div", { + class: _normalizeClass(['session-preview', { active: !!_ctx.activeSession }]), + ref: _ctx.setSessionPreviewContainerRef + }, [ + (_ctx.activeSession) + ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [ + _createElementVNode("div", { + class: "session-preview-scroll", + ref: _ctx.setSessionPreviewScrollRef, + onScroll: _ctx.onSessionPreviewScroll + }, [ + _createElementVNode("div", { + class: "session-preview-header", + ref: _ctx.setSessionPreviewHeaderRef + }, [ + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "session-preview-title" }, _toDisplayString(_ctx.activeSession.title || _ctx.activeSession.sessionId), 1 /* TEXT */), + _createElementVNode("div", { class: "session-preview-meta" }, [ + _createElementVNode("span", { + class: "session-preview-meta-item session-source", + "data-source": _ctx.activeSession.source + }, _toDisplayString(_ctx.activeSession.sourceLabel), 9 /* TEXT, PROPS */, ["data-source"]), + _createElementVNode("span", { class: "session-preview-meta-item" }, _toDisplayString(_ctx.activeSession.updatedAt || _ctx.t('sessions.unknownTime')), 1 /* TEXT */) + ]), + (_ctx.activeSession.cwd) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "session-preview-meta" + }, [ + _createElementVNode("span", { class: "session-preview-meta-item" }, _toDisplayString(_ctx.activeSession.cwd), 1 /* TEXT */) + ])) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "session-actions" }, [ + _createElementVNode("button", { + class: "btn-session-refresh", + onClick: _ctx.loadActiveSessionDetail, + disabled: _ctx.sessionDetailLoading || !_ctx.activeSession + }, _toDisplayString(_ctx.sessionDetailLoading ? _ctx.t('sessions.preview.loading') : _ctx.t('sessions.preview.refresh')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + (_ctx.isDeleteAvailable(_ctx.activeSession)) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + class: "btn-session-delete", + onClick: $event => (_ctx.deleteSession(_ctx.activeSession)), + disabled: !_ctx.activeSession || _ctx.sessionsLoading || _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)] + }, _toDisplayString((_ctx.activeSession && _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleting') : _ctx.t('sessions.preview.moving')) : (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleteHard') : _ctx.t('sessions.preview.moveToTrash'))), 9 /* TEXT, PROPS */, ["onClick", "disabled"])) + : _createCommentVNode("v-if", true), + _createElementVNode("button", { + class: "btn-session-export", + onClick: $event => (_ctx.exportSession(_ctx.activeSession)), + disabled: !_ctx.activeSession || _ctx.sessionExporting[_ctx.getSessionExportKey(_ctx.activeSession)] + }, _toDisplayString((_ctx.activeSession && _ctx.sessionExporting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? _ctx.t('sessions.preview.exporting') : _ctx.t('sessions.preview.export')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + class: "btn-session-open", + onClick: $event => (_ctx.copySessionLink(_ctx.activeSession)), + disabled: !_ctx.activeSession + }, _toDisplayString(_ctx.t('sessions.preview.copyLink')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ], 512 /* NEED_PATCH */), + (_ctx.sessionDetailLoading && !_ctx.sessionPreviewLoadingMore) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "session-preview-empty" + }, _toDisplayString(_ctx.t('sessions.preview.loadingBody')), 1 /* TEXT */)) + : (_ctx.activeSessionDetailError) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "session-preview-empty" + }, _toDisplayString(_ctx.activeSessionDetailError), 1 /* TEXT */)) + : (!_ctx.activeSessionMessages.length) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "session-preview-empty" + }, _toDisplayString(_ctx.t('sessions.preview.emptyMsgs')), 1 /* TEXT */)) + : (_ctx.sessionPreviewRenderEnabled && !_ctx.activeSessionVisibleMessages.length) + ? (_openBlock(), _createElementBlock("div", { + key: 3, + class: "session-preview-empty" + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('sessions.preview.rendering')), 1 /* TEXT */), + _createElementVNode("button", { + class: "btn-session-refresh", + onClick: _ctx.primeSessionPreviewMessageRender, + disabled: _ctx.sessionDetailLoading + }, _toDisplayString(_ctx.t('sessions.preview.rerender')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ])) + : (!_ctx.sessionPreviewRenderEnabled) + ? (_openBlock(), _createElementBlock("div", { + key: 4, + class: "session-preview-empty" + }, _toDisplayString(_ctx.t('sessions.preview.preparing')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 5, + class: "session-preview-body" + }, [ + _createElementVNode("div", { class: "session-preview-messages" }, [ + (_ctx.activeSessionDetailClipped) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "session-item-sub session-item-wrap" + }, _toDisplayString(_ctx.t('sessions.preview.clipped', { count: _ctx.activeSessionMessages.length })), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.activeSessionMessages, (msg, idx, ___, _cached) => { + const _memo = ([msg.text, msg.timestamp, msg.roleLabel, msg.normalizedRole]) + if (_cached && _cached.key === _ctx.getRecordRenderKey(msg, idx) && _isMemoSame(_cached, _memo)) return _cached + const _item = (_openBlock(), _createElementBlock("div", { + key: _ctx.getRecordRenderKey(msg, idx), + "data-message-key": _ctx.getRecordRenderKey(msg, idx), + ref_for: true, + ref: _ctx.getSessionMessageRefBinder(_ctx.getRecordRenderKey(msg, idx)), + class: _normalizeClass(['session-msg', msg.normalizedRole === 'user' ? 'user' : (msg.normalizedRole === 'system' ? 'system' : 'assistant')]) + }, [ + _createElementVNode("div", { class: "session-msg-header" }, [ + _createElementVNode("div", { class: "session-msg-meta" }, [ + _createElementVNode("span", { class: "session-msg-role" }, _toDisplayString(msg.roleLabel || (msg.normalizedRole === 'user' ? _ctx.t('sessions.roleLabel.user') : (msg.normalizedRole === 'system' ? _ctx.t('sessions.roleLabel.system') : _ctx.t('sessions.roleLabel.assistant')))), 1 /* TEXT */), + _createElementVNode("span", { class: "session-msg-time" }, _toDisplayString(msg.timestamp || ''), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { + class: "session-msg-content", + innerHTML: _ctx.highlightQueryText(msg.text) || '' + }, null, 8 /* PROPS */, ["innerHTML"]) + ], 10 /* CLASS, PROPS */, ["data-message-key"])) + _item.memo = _memo + return _item + }, _cache, 2), 128 /* KEYED_FRAGMENT */)) + ]) + ])) + ], 40 /* PROPS, NEED_HYDRATION */, ["onScroll"]), + (_ctx.sessionPreviewRenderEnabled && _ctx.sessionTimelineNodes.length) + ? (_openBlock(), _createElementBlock("aside", { + key: 0, + class: "session-timeline", + "aria-label": _ctx.t('sessions.timeline.aria') + }, [ + _createElementVNode("div", { class: "session-timeline-track" }), + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionTimelineNodes, (node, __, ___, _cached) => { + const _memo = ([_ctx.sessionTimelineActiveKey === node.key, node.safePercent, node.title]) + if (_cached && _cached.key === 'timeline-' + node.key && _isMemoSame(_cached, _memo)) return _cached + const _item = (_openBlock(), _createElementBlock("button", { + key: 'timeline-' + node.key, + type: "button", + class: _normalizeClass(['session-timeline-node', { active: _ctx.sessionTimelineActiveKey === node.key }]), + "aria-current": _ctx.sessionTimelineActiveKey === node.key ? 'true' : null, + style: _normalizeStyle({ top: `${node.safePercent}%` }), + title: node.title, + onClick: $event => (_ctx.jumpToSessionTimelineNode(node.key)) + }, [ + _createElementVNode("span", { class: "sr-only" }, _toDisplayString(node.title), 1 /* TEXT */) + ], 14 /* CLASS, STYLE, PROPS */, ["aria-current", "title", "onClick"])) + _item.memo = _memo + return _item + }, _cache, 4), 128 /* KEYED_FRAGMENT */)), + (_ctx.sessionTimelineActiveTitle) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "session-timeline-current" + }, _toDisplayString(_ctx.sessionTimelineActiveTitle), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ], 8 /* PROPS */, ["aria-label"])) + : _createCommentVNode("v-if", true) + ], 64 /* STABLE_FRAGMENT */)) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "session-preview-empty" + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.t('sessions.selectHint')), 1 /* TEXT */) + ])) + ], 2 /* CLASS */) + ])) + ])) + ], 512 /* NEED_PATCH */), [ + [_vShow, _ctx.mainTab === 'sessions'] + ]), + _createCommentVNode(" Usage 统计 - 时光之河设计 "), + _withDirectives(_createElementVNode("div", { + class: "mode-content", + id: "panel-usage", + role: "tabpanel", + "aria-labelledby": 'tab-usage' + }, [ + _createElementVNode("div", { class: "usage-toolbar" }, [ + _createElementVNode("span", { class: "usage-toolbar-title" }, _toDisplayString(_ctx.t('usage.overview')), 1 /* TEXT */), + _createElementVNode("div", { + class: "usage-range-group", + role: "group", + "aria-label": _ctx.t('usage.range.aria') + }, [ + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["usage-range-btn", { active: _ctx.sessionsUsageTimeRange === '7d' }]), + onClick: $event => (_ctx.setSessionsUsageTimeRange('7d')) + }, _toDisplayString(_ctx.t('usage.range.7d')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["usage-range-btn", { active: _ctx.sessionsUsageTimeRange === '30d' }]), + onClick: $event => (_ctx.setSessionsUsageTimeRange('30d')) + }, _toDisplayString(_ctx.t('usage.range.30d')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["usage-range-btn", { active: _ctx.sessionsUsageTimeRange === 'all' }]), + onClick: $event => (_ctx.setSessionsUsageTimeRange('all')) + }, _toDisplayString(_ctx.t('usage.range.all')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "usage-range-btn usage-range-btn-icon", + onClick: $event => (_ctx.loadSessionsUsage({ forceRefresh: true, range: _ctx.sessionsUsageTimeRange })), + disabled: _ctx.sessionsUsageLoading, + title: _ctx.t('usage.refresh') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + class: "btn-icon-sm" + }, [ + _createElementVNode("path", { d: "M21 2v6h-6M3 12a9 9 0 0 1 15-6.7L21 8M3 22v-6h6M21 12a9 9 0 0 1-15 6.7L3 16" }) + ])) + ], 8 /* PROPS */, ["onClick", "disabled", "title"]) + ], 8 /* PROPS */, ["aria-label"]) + ]), + (_ctx.sessionsUsageLoading && !_ctx.sessionsUsageList.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "usage-empty-state" + }, [ + _createElementVNode("div", { class: "usage-empty-illustration" }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 64 64", + fill: "none", + xmlns: "http://www.w3.org/2000/svg" + }, [ + _createElementVNode("circle", { + cx: "32", + cy: "32", + r: "28", + stroke: "currentColor", + "stroke-width": "2", + "stroke-dasharray": "4 4", + opacity: "0.3" + }), + _createElementVNode("circle", { + cx: "32", + cy: "32", + r: "20", + stroke: "currentColor", + "stroke-width": "2", + opacity: "0.5" + }), + _createElementVNode("path", { + d: "M32 20V32L40 36", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round" + }) + ])) + ]), + _createElementVNode("p", { class: "usage-empty-text" }, _toDisplayString(_ctx.t('usage.loading')), 1 /* TEXT */) + ])) + : (_ctx.sessionsUsageError && !_ctx.sessionsUsageList.length) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "usage-empty-state" + }, [ + _createElementVNode("div", { class: "usage-empty-illustration" }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 64 64", + fill: "none", + xmlns: "http://www.w3.org/2000/svg" + }, [ + _createElementVNode("path", { + d: "M20 20L44 44M44 20L20 44", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round" + }) + ])) + ]), + _createElementVNode("p", { class: "usage-empty-text" }, _toDisplayString(_ctx.sessionsUsageError), 1 /* TEXT */) + ])) + : (!_ctx.sessionsUsageList.length) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "usage-empty-state" + }, [ + _createElementVNode("div", { class: "usage-empty-illustration" }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 64 64", + fill: "none", + xmlns: "http://www.w3.org/2000/svg" + }, [ + _createElementVNode("rect", { + x: "12", + y: "16", + width: "40", + height: "32", + rx: "2", + stroke: "currentColor", + "stroke-width": "2" + }), + _createElementVNode("path", { + d: "M20 26H44M20 32H36M20 38H32", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round" + }) + ])) + ]), + _createElementVNode("p", { class: "usage-empty-text" }, _toDisplayString(_ctx.t('usage.empty')), 1 /* TEXT */) + ])) + : (_openBlock(), _createElementBlock("div", { + key: 3, + class: _normalizeClass(["usage-content", { 'usage-content-loading': _ctx.sessionsUsageLoading }]) + }, [ + (_ctx.sessionsUsageLoading) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "usage-content-overlay", + "aria-live": "polite" + }, [ + _createElementVNode("span", { + class: "usage-spinner", + "aria-hidden": "true" + }) + ])) + : _createCommentVNode("v-if", true), + _createCommentVNode(" Hero 区域:合并当前会话条 + 主要指标 "), + _createElementVNode("div", { class: "usage-hero" }, [ + (_ctx.usageCurrentSessionStats) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "usage-hero-active" + }, [ + _createElementVNode("span", { class: "usage-hero-active-dot" }), + _createElementVNode("span", { class: "usage-hero-active-label" }, _toDisplayString(_ctx.usageCurrentSessionStats.label), 1 /* TEXT */), + _createElementVNode("span", { class: "usage-hero-active-stat" }, _toDisplayString(_ctx.usageCurrentSessionStats.tokenLabel) + " tokens", 1 /* TEXT */), + _createElementVNode("span", { class: "usage-hero-active-stat" }, _toDisplayString(_ctx.usageCurrentSessionStats.apiDurationLabel) + " API", 1 /* TEXT */), + _createElementVNode("span", { class: "usage-hero-active-stat" }, _toDisplayString(_ctx.usageCurrentSessionStats.totalDurationLabel) + " total", 1 /* TEXT */) + ])) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "usage-hero-metrics" }, [ + _createElementVNode("div", { class: "usage-hero-main" }, _toDisplayString(_ctx.usageHeroMainValue), 1 /* TEXT */), + _createElementVNode("div", { class: "usage-hero-sub" }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.usageHeroSubLabel), 1 /* TEXT */), + (_ctx.usageHeroDelta) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: _normalizeClass(['usage-hero-delta', _ctx.usageHeroDeltaClass]) + }, _toDisplayString(_ctx.usageHeroDelta), 3 /* TEXT, CLASS */)) + : _createCommentVNode("v-if", true) + ]) + ]) + ]), + _createCommentVNode(" 波浪图:替换柱状图 "), + (_ctx.sessionUsageWave.points && _ctx.sessionUsageWave.points.length) + ? (_openBlock(), _createElementBlock("section", { + key: 1, + class: "usage-card usage-wave-section" + }, [ + _createElementVNode("div", { class: "usage-card-title" }, _toDisplayString(_ctx.t('usage.daily.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "usage-wave-container" }, [ + (_openBlock(), _createElementBlock("svg", { + class: "usage-wave-chart", + viewBox: "0 0 800 140", + preserveAspectRatio: "none" + }, [ + _createElementVNode("defs", null, [ + _createElementVNode("linearGradient", { + id: 'wave-gradient-' + _ctx.sessionsUsageTimeRange, + x1: "0", + y1: "0", + x2: "0", + y2: "1" + }, [ + _createElementVNode("stop", { + offset: "0%", + "stop-color": 'var(--color-brand)', + "stop-opacity": "0.3" + }), + _createElementVNode("stop", { + offset: "100%", + "stop-color": 'var(--color-brand)', + "stop-opacity": "0" + }) + ], 8 /* PROPS */, ["id"]) + ]), + _createCommentVNode(" 填充区域 "), + _createElementVNode("path", { + d: _ctx.sessionUsageWave.areaPath, + fill: 'url(#wave-gradient-' + _ctx.sessionsUsageTimeRange + ')', + class: "usage-wave-area" + }, null, 8 /* PROPS */, ["d", "fill"]), + _createCommentVNode(" 曲线 "), + _createElementVNode("path", { + d: _ctx.sessionUsageWave.linePath, + fill: "none", + stroke: 'var(--color-brand)', + "stroke-width": "2.5", + "stroke-linecap": "round", + "stroke-linejoin": "round", + class: "usage-wave-line" + }, null, 8 /* PROPS */, ["d"]), + _createCommentVNode(" 悬停指示线 "), + (_ctx.sessionsUsageSelectedDay) + ? (_openBlock(), _createElementBlock("line", { + key: 0, + x1: "0", + x2: _ctx.sessionUsageWave.width, + y1: _ctx.sessionUsageWave.hoverY, + y2: _ctx.sessionUsageWave.hoverY, + stroke: "currentColor", + "stroke-width": "1", + "stroke-dasharray": "4 4", + opacity: "0.4", + class: "usage-wave-hover-line" + }, null, 8 /* PROPS */, ["x2", "y1", "y2"])) + : _createCommentVNode("v-if", true), + _createCommentVNode(" 悬停点 "), + (_ctx.sessionsUsageSelectedDay) + ? (_openBlock(), _createElementBlock("circle", { + key: 1, + cx: _ctx.sessionUsageWave.hoverX, + cy: _ctx.sessionUsageWave.hoverY, + r: "5", + fill: 'var(--color-surface)', + stroke: 'var(--color-brand)', + "stroke-width": "2.5", + class: "usage-wave-hover-point" + }, null, 8 /* PROPS */, ["cx", "cy"])) + : _createCommentVNode("v-if", true) + ])), + _createElementVNode("div", { class: "usage-wave-labels" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionUsageWave.labels, (label) => { + return (_openBlock(), _createElementBlock("span", { + key: label.key, + class: _normalizeClass(["usage-wave-label", { active: _ctx.sessionsUsageSelectedDay === label.key }]), + onClick: $event => (_ctx.selectSessionsUsageDay(label.key)) + }, _toDisplayString(label.text), 11 /* TEXT, CLASS, PROPS */, ["onClick"])) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ]), + (_ctx.sessionsUsageSelectedDaySummary) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "usage-daydetail" + }, [ + _createElementVNode("div", { class: "usage-daydetail-header" }, [ + _createElementVNode("span", { class: "usage-daydetail-date" }, _toDisplayString(_ctx.sessionsUsageSelectedDaySummary.dayKey), 1 /* TEXT */), + _createElementVNode("span", { class: "usage-daydetail-stats" }, _toDisplayString(_ctx.sessionsUsageSelectedDaySummary.sessionCount) + " sessions · " + _toDisplayString(_ctx.sessionsUsageSelectedDaySummary.tokenLabel) + " tokens", 1 /* TEXT */) + ]), + (_ctx.sessionsUsageSelectedDaySummary.prevTokenLabel !== null) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "usage-daydetail-compare" + }, _toDisplayString(_ctx.t('usage.compare.prev')) + " " + _toDisplayString(_ctx.sessionsUsageSelectedDaySummary.prevTokenLabel) + " tokens · " + _toDisplayString(_ctx.t('usage.compare.delta')) + " " + _toDisplayString(_ctx.sessionsUsageSelectedDaySummary.deltaTokenLabel), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ])) + : _createCommentVNode("v-if", true) + ])) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "usage-chart-grid" }, [ + _createCommentVNode(" 热力图:垂直活动条 "), + _createElementVNode("section", { class: "usage-card usage-hourly-heatmap" }, [ + _createElementVNode("div", { class: "usage-card-title" }, _toDisplayString(_ctx.t('usage.hourlyHeatmap.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "hourly-heatmap-wrapper" }, [ + _createElementVNode("div", { class: "hourly-heatmap-header" }, [ + _createElementVNode("div", { class: "hourly-heatmap-corner" }), + (_openBlock(), _createElementBlock(_Fragment, null, _renderList(24, (h) => { + return _createElementVNode("div", { + key: 'hdr-' + h, + class: "hourly-heatmap-hour-label" + }, _toDisplayString(h - 1), 1 /* TEXT */) + }), 64 /* STABLE_FRAGMENT */)) + ]), + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionUsageHourlyHeatmap.rows, (row) => { + return (_openBlock(), _createElementBlock("div", { + key: row.weekday, + class: "hourly-heatmap-row" + }, [ + _createElementVNode("div", { class: "hourly-heatmap-weekday-label" }, _toDisplayString(row.weekday), 1 /* TEXT */), + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(row.cells, (cell) => { + return (_openBlock(), _createElementBlock("div", { + key: 'cell-' + row.weekday + '-' + cell.hour, + class: _normalizeClass(['hourly-heatmap-cell', 'level-' + cell.level]), + title: cell.tooltip + }, null, 10 /* CLASS, PROPS */, ["title"])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ]), + _createElementVNode("div", { class: "hourly-heatmap-legend" }, [ + _createElementVNode("span", { class: "hourly-heatmap-legend-label" }, _toDisplayString(_ctx.t('usage.hourlyHeatmap.legend.less')), 1 /* TEXT */), + _createElementVNode("span", { class: "hourly-heatmap-cell level-1" }), + _createElementVNode("span", { class: "hourly-heatmap-cell level-2" }), + _createElementVNode("span", { class: "hourly-heatmap-cell level-3" }), + _createElementVNode("span", { class: "hourly-heatmap-cell level-4" }), + _createElementVNode("span", { class: "hourly-heatmap-legend-label" }, _toDisplayString(_ctx.t('usage.hourlyHeatmap.legend.more')), 1 /* TEXT */) + ]) + ]), + _createCommentVNode(" Top Sessions "), + _createElementVNode("section", { class: "usage-card" }, [ + _createElementVNode("div", { class: "usage-card-title" }, _toDisplayString(_ctx.t('usage.sessions.topDensity')), 1 /* TEXT */), + (!_ctx.sessionUsageCharts.topSessionsByMessages.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "usage-list-value" + }, _toDisplayString(_ctx.t('usage.sessions.empty')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "usage-list-compact" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionUsageCharts.topSessionsByMessages, (item) => { + return (_openBlock(), _createElementBlock("div", { + key: item.key + '-dense', + class: "usage-list-compact-item", + onClick: $event => (_ctx.selectSession(item)), + title: item.title + }, [ + _createElementVNode("span", { class: "usage-list-bullet" }, "·"), + _createElementVNode("div", { class: "usage-list-compact-content" }, [ + _createElementVNode("div", { class: "usage-list-title" }, _toDisplayString(item.title), 1 /* TEXT */), + _createElementVNode("div", { class: "usage-list-meta" }, _toDisplayString(item.messageCount) + " msgs · " + _toDisplayString(item.sourceLabel) + " · " + _toDisplayString(item.updatedAtLabel), 1 /* TEXT */) + ]) + ], 8 /* PROPS */, ["onClick", "title"])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ]), + _createCommentVNode(" Recent Activity "), + _createElementVNode("section", { class: "usage-card" }, [ + _createElementVNode("div", { class: "usage-card-title" }, _toDisplayString(_ctx.t('usage.recent.title')), 1 /* TEXT */), + (!_ctx.sessionUsageCharts.recentSessions.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "usage-list-value" + }, _toDisplayString(_ctx.t('usage.sessions.empty')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "usage-list-compact" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionUsageCharts.recentSessions, (item) => { + return (_openBlock(), _createElementBlock("div", { + key: item.key, + class: "usage-list-compact-item", + onClick: $event => (_ctx.selectSession(item)) + }, [ + _createElementVNode("span", { class: "usage-list-bullet" }, "·"), + _createElementVNode("div", { class: "usage-list-compact-content" }, [ + _createElementVNode("div", { class: "usage-list-title" }, _toDisplayString(item.title), 1 /* TEXT */), + _createElementVNode("div", { class: "usage-list-meta" }, _toDisplayString(item.messageCount) + " msgs · " + _toDisplayString(item.sourceLabel) + " · " + _toDisplayString(item.updatedAtLabel), 1 /* TEXT */) + ]) + ], 8 /* PROPS */, ["onClick"])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ]), + _createCommentVNode(" Top Paths "), + _createElementVNode("section", { class: "usage-card usage-paths-section" }, [ + _createElementVNode("div", { class: "usage-card-title" }, _toDisplayString(_ctx.t('usage.paths.title')), 1 /* TEXT */), + (!_ctx.sessionUsageCharts.topPaths.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "usage-list-value" + }, _toDisplayString(_ctx.t('usage.paths.empty')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "usage-list-paths" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionUsageCharts.topPaths, (item, index) => { + return (_openBlock(), _createElementBlock("div", { + key: item.path, + class: "usage-list-path-row" + }, [ + _createElementVNode("span", { class: "usage-list-path-rank" }, _toDisplayString(index + 1), 1 /* TEXT */), + _createElementVNode("div", { class: "usage-list-path-content" }, [ + _createElementVNode("div", { + class: "usage-list-path", + title: item.path + }, _toDisplayString(item.path), 9 /* TEXT, PROPS */, ["title"]), + _createElementVNode("div", { class: "usage-list-path-stat" }, _toDisplayString(item.count), 1 /* TEXT */) + ]) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ]) + ]) + ], 2 /* CLASS */)) + ], 512 /* NEED_PATCH */), [ + [_vShow, _ctx.mainTab === 'usage'] + ]), + (_ctx.taskOrchestrationTabEnabled) + ? _withDirectives((_openBlock(), _createElementBlock("div", { + key: 0, + class: "mode-content", + id: "panel-orchestration", + role: "tabpanel", + "aria-labelledby": "tab-orchestration" + }, [ + _createElementVNode("section", { class: "selector-section task-hero-card" }, [ + _createElementVNode("div", { class: "task-hero-main" }, [ + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "task-hero-kicker" }, _toDisplayString(_ctx.t('orchestration.hero.kicker')), 1 /* TEXT */), + _createElementVNode("div", { class: "selector-title" }, _toDisplayString(_ctx.t('orchestration.hero.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-panel-note task-hero-copy" }, _toDisplayString(_ctx.t('orchestration.hero.subtitle')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "task-hero-actions settings-tab-actions task-header-actions" }, [ + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.loadTaskOrchestrationOverview({ forceRefresh: true, includeDetail: true })), + disabled: _ctx.taskOrchestration.loading + }, _toDisplayString(_ctx.taskOrchestration.loading ? _ctx.t('common.refreshing') : _ctx.t('common.refresh')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.resetTaskOrchestrationDraft()), + disabled: _ctx.taskOrchestration.running || _ctx.taskOrchestration.queueAdding || _ctx.taskOrchestration.planning + }, _toDisplayString(_ctx.t('orchestration.draft.reset')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.switchMainTab('dashboard')), + disabled: _ctx.loading || !!_ctx.initError + }, _toDisplayString(_ctx.t('dashboard.doctor.title')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + (_ctx.taskOrchestrationQueueStats.running || _ctx.taskOrchestrationQueueStats.queued || _ctx.taskOrchestration.runs.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-hero-meta-strip", + "aria-label": _ctx.t('orchestration.summary.aria') + }, [ + _createElementVNode("div", { class: "task-hero-meta" }, [ + _createTextVNode(_toDisplayString(_ctx.t('orchestration.summary.running')) + " ", 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.taskOrchestrationQueueStats.running), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "task-hero-meta" }, [ + _createTextVNode(_toDisplayString(_ctx.t('orchestration.summary.queued')) + " ", 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.taskOrchestrationQueueStats.queued), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "task-hero-meta" }, [ + _createTextVNode(_toDisplayString(_ctx.t('orchestration.summary.runs')) + " ", 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.taskOrchestration.runs.length), 1 /* TEXT */) + ]) + ], 8 /* PROPS */, ["aria-label"])) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "task-layout-grid task-layout-grid-primary" }, [ + _createElementVNode("section", { class: "selector-section task-compose-flow-card" }, [ + _createElementVNode("div", { class: "task-flow-section task-flow-section-compact" }, [ + _createElementVNode("div", { class: "task-flow-head" }, [ + _createElementVNode("div", { class: "task-flow-step" }, "1"), + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "task-flow-title" }, _toDisplayString(_ctx.t('orchestration.step1.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "task-flow-copy" }, _toDisplayString(_ctx.t('orchestration.step1.subtitle')), 1 /* TEXT */) + ]) + ]), + (!_ctx.taskOrchestration.target.trim()) + ? (_openBlock(), _createElementBlock("details", { + key: 0, + class: "task-template-panel" + }, [ + _createElementVNode("summary", { class: "task-advanced-summary" }, _toDisplayString(_ctx.t('orchestration.templates.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "task-template-block" }, [ + _createElementVNode("div", { class: "task-template-chip-group" }, [ + _createElementVNode("button", { + type: "button", + class: "task-template-chip", + onClick: $event => {_ctx.taskOrchestration.target = _ctx.t('orchestration.templates.reviewFix.target'); _ctx.taskOrchestration.selectedEngine = 'codex'; _ctx.taskOrchestration.workflowIdsText = ''; _ctx.taskOrchestration.notes = _ctx.t('orchestration.templates.reviewFix.notes'); _ctx.taskOrchestration.followUpsText = _ctx.t('orchestration.templates.reviewFix.followUps')} + }, _toDisplayString(_ctx.t('orchestration.templates.reviewFix.label')), 9 /* TEXT, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "task-template-chip", + onClick: $event => {_ctx.taskOrchestration.target = _ctx.t('orchestration.templates.planOnly.target'); _ctx.taskOrchestration.selectedEngine = 'codex'; _ctx.taskOrchestration.workflowIdsText = ''; _ctx.taskOrchestration.notes = _ctx.t('orchestration.templates.planOnly.notes'); _ctx.taskOrchestration.followUpsText = ''} + }, _toDisplayString(_ctx.t('orchestration.templates.planOnly.label')), 9 /* TEXT, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: "task-template-chip", + onClick: $event => {_ctx.taskOrchestration.target = _ctx.t('orchestration.templates.workflowBatch.target'); _ctx.taskOrchestration.selectedEngine = 'workflow'; _ctx.taskOrchestration.workflowIdsText = _ctx.t('orchestration.templates.workflowBatch.workflowIds'); _ctx.taskOrchestration.notes = _ctx.t('orchestration.templates.workflowBatch.notes'); _ctx.taskOrchestration.followUpsText = ''} + }, _toDisplayString(_ctx.t('orchestration.templates.workflowBatch.label')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ]) + ])) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "selector-grid task-composer-grid task-composer-grid-primary" }, [ + _createElementVNode("label", { class: "selector-field task-field task-field-wide task-goal-field" }, [ + _createElementVNode("span", { class: "selector-label" }, _toDisplayString(_ctx.t('orchestration.fields.target')), 1 /* TEXT */), + _withDirectives(_createElementVNode("textarea", { + "onUpdate:modelValue": $event => ((_ctx.taskOrchestration.target) = $event), + class: "task-textarea task-textarea-goal", + rows: "5", + placeholder: _ctx.t('orchestration.fields.target.placeholder') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.taskOrchestration.target] + ]), + _createElementVNode("span", { class: "task-field-hint" }, _toDisplayString(_ctx.t('orchestration.fields.target.hint')), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "task-draft-overview task-draft-inline" }, [ + _createElementVNode("div", { class: "task-draft-inline-head" }, [ + _createElementVNode("span", { + class: _normalizeClass(['pill', _ctx.taskOrchestrationDraftReadiness.tone]) + }, _toDisplayString(_ctx.taskOrchestrationDraftReadiness.title), 3 /* TEXT, CLASS */), + _createElementVNode("div", { class: "task-readiness-copy task-draft-inline-copy" }, _toDisplayString(_ctx.taskOrchestrationDraftReadiness.summary), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "task-config-strip" }, [ + _createElementVNode("div", { class: "task-config-pill" }, _toDisplayString(_ctx.taskOrchestration.selectedEngine === 'workflow' ? _ctx.t('orchestration.engine.workflow') : _ctx.t('orchestration.engine.codex')), 1 /* TEXT */), + _createElementVNode("div", { class: "task-config-pill" }, _toDisplayString(_ctx.taskOrchestration.runMode === 'dry-run' ? _ctx.t('orchestration.runMode.dryRun') : (_ctx.taskOrchestration.runMode === 'read' ? _ctx.t('orchestration.runMode.readOnly') : _ctx.t('orchestration.runMode.write'))), 1 /* TEXT */), + (_ctx.taskOrchestration.title.trim()) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-config-pill" + }, _toDisplayString(_ctx.t('orchestration.pills.hasTitle')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.taskOrchestration.selectedEngine === 'workflow' && _ctx.taskOrchestrationDraftMetrics.workflowCount > 0) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "task-config-pill" + }, _toDisplayString(_ctx.t('orchestration.pills.workflowCount', { count: _ctx.taskOrchestrationDraftMetrics.workflowCount })), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.taskOrchestration.plan) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "task-config-pill" + }, _toDisplayString(_ctx.t('orchestration.pills.planNodes', { count: _ctx.taskOrchestrationDraftMetrics.planNodeCount })), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ]) + ]), + _createElementVNode("div", { class: "task-flow-section task-flow-section-compact" }, [ + _createElementVNode("div", { class: "task-flow-head" }, [ + _createElementVNode("div", { class: "task-flow-step" }, "2"), + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "task-flow-title" }, _toDisplayString(_ctx.t('orchestration.step2.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "task-flow-copy" }, _toDisplayString(_ctx.t('orchestration.step2.subtitle')), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "selector-grid task-composer-grid task-composer-grid-compact task-composer-grid-inline" }, [ + _createElementVNode("label", { class: "selector-field" }, [ + _createElementVNode("span", { class: "selector-label" }, _toDisplayString(_ctx.t('orchestration.fields.engine')), 1 /* TEXT */), + _withDirectives(_createElementVNode("select", { + "onUpdate:modelValue": $event => ((_ctx.taskOrchestration.selectedEngine) = $event), + class: "provider-fast-switch-select", + disabled: "" + }, [ + _createElementVNode("option", { value: "codex" }, _toDisplayString(_ctx.t('orchestration.engine.codex')), 1 /* TEXT */), + _createElementVNode("option", { value: "workflow" }, _toDisplayString(_ctx.t('orchestration.engine.workflow')), 1 /* TEXT */) + ], 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelSelect, _ctx.taskOrchestration.selectedEngine] + ]) + ]), + _createElementVNode("label", { class: "selector-field" }, [ + _createElementVNode("span", { class: "selector-label" }, _toDisplayString(_ctx.t('orchestration.fields.runMode')), 1 /* TEXT */), + _withDirectives(_createElementVNode("select", { + "onUpdate:modelValue": $event => ((_ctx.taskOrchestration.runMode) = $event), + class: "provider-fast-switch-select", + disabled: "" + }, [ + _createElementVNode("option", { value: "write" }, _toDisplayString(_ctx.t('orchestration.runMode.write')), 1 /* TEXT */), + _createElementVNode("option", { value: "read" }, _toDisplayString(_ctx.t('orchestration.runMode.readOnly')), 1 /* TEXT */), + _createElementVNode("option", { value: "dry-run" }, _toDisplayString(_ctx.t('orchestration.runMode.dryRun')), 1 /* TEXT */) + ], 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelSelect, _ctx.taskOrchestration.runMode] + ]) + ]) + ]), + _createElementVNode("details", { class: "task-advanced-panel" }, [ + _createElementVNode("summary", { class: "task-advanced-summary" }, _toDisplayString(_ctx.t('orchestration.advanced.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "selector-grid task-composer-grid task-composer-grid-secondary" }, [ + _createElementVNode("label", { class: "selector-field task-field-wide" }, [ + _createElementVNode("span", { class: "selector-label" }, _toDisplayString(_ctx.t('orchestration.fields.title')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.taskOrchestration.title) = $event), + class: "model-input", + type: "text", + placeholder: _ctx.t('orchestration.fields.title.placeholder') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.taskOrchestration.title] + ]) + ]), + _createElementVNode("label", { class: "selector-field task-field-wide" }, [ + _createElementVNode("span", { class: "selector-label" }, _toDisplayString(_ctx.t('orchestration.fields.notes')), 1 /* TEXT */), + _withDirectives(_createElementVNode("textarea", { + "onUpdate:modelValue": $event => ((_ctx.taskOrchestration.notes) = $event), + class: "task-textarea", + rows: "3", + placeholder: _ctx.t('orchestration.fields.notes.placeholder') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.taskOrchestration.notes] + ]), + _createElementVNode("span", { class: "task-field-hint" }, _toDisplayString(_ctx.t('orchestration.fields.notes.hint')), 1 /* TEXT */) + ]), + _createElementVNode("label", { class: "selector-field task-field-wide" }, [ + _createElementVNode("span", { class: "selector-label" }, _toDisplayString(_ctx.t('orchestration.fields.followUps')), 1 /* TEXT */), + _withDirectives(_createElementVNode("textarea", { + "onUpdate:modelValue": $event => ((_ctx.taskOrchestration.followUpsText) = $event), + class: "task-textarea", + rows: "3", + placeholder: _ctx.t('orchestration.fields.followUps.placeholder') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.taskOrchestration.followUpsText] + ]) + ]), + _createElementVNode("label", { class: "selector-field" }, [ + _createElementVNode("span", { class: "selector-label" }, _toDisplayString(_ctx.t('orchestration.fields.concurrency')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.taskOrchestration.concurrency) = $event), + class: "model-input", + type: "number", + min: "1", + max: "8" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.taskOrchestration.concurrency] + ]), + _createElementVNode("span", { class: "task-field-hint" }, _toDisplayString(_ctx.t('orchestration.fields.concurrency.hint')), 1 /* TEXT */) + ]), + _createElementVNode("label", { class: "selector-field" }, [ + _createElementVNode("span", { class: "selector-label" }, _toDisplayString(_ctx.t('orchestration.fields.autoFixRounds')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.taskOrchestration.autoFixRounds) = $event), + class: "model-input", + type: "number", + min: "0", + max: "5" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.taskOrchestration.autoFixRounds] + ]), + _createElementVNode("span", { class: "task-field-hint" }, _toDisplayString(_ctx.t('orchestration.fields.autoFixRounds.hint')), 1 /* TEXT */) + ]), + (_ctx.taskOrchestration.selectedEngine === 'workflow') + ? (_openBlock(), _createElementBlock("label", { + key: 0, + class: "selector-field task-field-wide" + }, [ + _createElementVNode("span", { class: "selector-label" }, _toDisplayString(_ctx.t('orchestration.fields.workflowIds')), 1 /* TEXT */), + _withDirectives(_createElementVNode("textarea", { + "onUpdate:modelValue": $event => ((_ctx.taskOrchestration.workflowIdsText) = $event), + class: "task-textarea", + rows: "3", + placeholder: _ctx.t('orchestration.fields.workflowIds.placeholder') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.taskOrchestration.workflowIdsText] + ]), + _createElementVNode("span", { class: "task-field-hint" }, _toDisplayString(_ctx.t('orchestration.fields.workflowIds.hint', { count: _ctx.taskOrchestration.workflows.length })), 1 /* TEXT */), + (_ctx.taskOrchestration.workflows.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-workflow-suggestions" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.taskOrchestration.workflows, (workflow) => { + return (_openBlock(), _createElementBlock("button", { + key: workflow.id || workflow.name, + type: "button", + class: "task-workflow-chip", + onClick: $event => (_ctx.appendTaskWorkflowId(workflow.id || workflow.name)) + }, [ + _createElementVNode("span", null, _toDisplayString(workflow.name || workflow.id), 1 /* TEXT */), + (workflow.stepCount) + ? (_openBlock(), _createElementBlock("small", { key: 0 }, _toDisplayString(_ctx.t('orchestration.workflow.stepCount', { count: workflow.stepCount })), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ], 8 /* PROPS */, ["onClick"])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + : _createCommentVNode("v-if", true) + ])) + : _createCommentVNode("v-if", true) + ]) + ]) + ]), + _createElementVNode("div", { class: "task-flow-section task-flow-section-actions task-flow-section-compact" }, [ + _createElementVNode("div", { class: "task-flow-head" }, [ + _createElementVNode("div", { class: "task-flow-step" }, "3"), + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "task-flow-title" }, _toDisplayString(_ctx.t('orchestration.step3.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "task-flow-copy" }, _toDisplayString(_ctx.t('orchestration.step3.subtitle')), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "task-action-row task-action-row-prominent" }, [ + _createElementVNode("button", { + type: "button", + class: "btn-tool task-action-preview", + onClick: $event => (_ctx.previewTaskPlan()), + disabled: _ctx.taskOrchestration.planning || _ctx.taskOrchestration.running || !_ctx.taskOrchestration.target.trim() + }, _toDisplayString(_ctx.taskOrchestration.planning ? _ctx.t('orchestration.actions.planning') : _ctx.t('orchestration.actions.previewOnly')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("div", { class: "task-action-row-right task-action-row-right-prominent" }, [ + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-primary", + onClick: $event => (_ctx.planAndRunTaskOrchestration()), + disabled: _ctx.taskOrchestration.running || _ctx.taskOrchestration.planning || !_ctx.taskOrchestration.target.trim() + }, _toDisplayString((_ctx.taskOrchestration.running || _ctx.taskOrchestration.planning) ? _ctx.t('orchestration.actions.preparing') : (_ctx.taskOrchestration.runMode === 'dry-run' ? _ctx.t('orchestration.actions.generatePlan') : _ctx.t('orchestration.actions.planAndRun'))), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "btn-tool", + onClick: $event => (_ctx.queueTaskOrchestrationAndStart()), + disabled: _ctx.taskOrchestration.queueAdding || _ctx.taskOrchestration.queueStarting || _ctx.taskOrchestration.planning || !_ctx.taskOrchestration.target.trim() + }, _toDisplayString((_ctx.taskOrchestration.queueAdding || _ctx.taskOrchestration.queueStarting) ? _ctx.t('orchestration.actions.processing') : _ctx.t('orchestration.actions.queueAndStart')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + _createElementVNode("div", { class: "task-action-caption" }, _toDisplayString(_ctx.t('orchestration.actions.caption')), 1 /* TEXT */) + ]) + ]) + ]), + (!(_ctx.taskOrchestration.plan || _ctx.taskOrchestration.planIssues.length || _ctx.taskOrchestration.planWarnings.length || _ctx.taskOrchestration.lastError || _ctx.taskOrchestration.queue.length || _ctx.taskOrchestration.runs.length || _ctx.taskOrchestration.selectedRunId || _ctx.taskOrchestration.selectedRunError)) + ? (_openBlock(), _createElementBlock("section", { + key: 0, + class: "selector-section task-stage-card" + }, [ + _createElementVNode("div", { class: "task-stage-empty" }, [ + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "selector-title" }, _toDisplayString(_ctx.t('orchestration.stage.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-panel-note" }, _toDisplayString(_ctx.t('orchestration.stage.subtitle')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "task-stage-strip" }, [ + _createElementVNode("div", { class: "task-stage-pill" }, _toDisplayString(_ctx.t('orchestration.stage.pill.target')), 1 /* TEXT */), + _createElementVNode("div", { class: "task-stage-pill" }, _toDisplayString(_ctx.t('orchestration.stage.pill.preview')), 1 /* TEXT */), + _createElementVNode("div", { class: "task-stage-pill" }, _toDisplayString(_ctx.t('orchestration.stage.pill.run')), 1 /* TEXT */) + ]) + ]) + ])) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "task-layout-grid task-layout-grid-secondary" + }, [ + (_ctx.taskOrchestration.plan || _ctx.taskOrchestration.planIssues.length || _ctx.taskOrchestration.planWarnings.length || _ctx.taskOrchestration.lastError) + ? (_openBlock(), _createElementBlock("section", { + key: 0, + class: "selector-section task-plan-card" + }, [ + (_ctx.taskOrchestration.lastError) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-issue-item" + }, _toDisplayString(_ctx.taskOrchestration.lastError), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "selector-header task-section-header" }, [ + _createElementVNode("div", null, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('orchestration.plan.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-panel-note" }, _toDisplayString(_ctx.t('orchestration.plan.subtitle')), 1 /* TEXT */) + ]) + ]), + (_ctx.taskOrchestration.planIssues.length) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "task-issues-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.taskOrchestration.planIssues, (issue) => { + return (_openBlock(), _createElementBlock("div", { + key: issue.code + issue.message, + class: "task-issue-item" + }, _toDisplayString(issue.message), 1 /* TEXT */)) + }), 128 /* KEYED_FRAGMENT */)) + ])) + : _createCommentVNode("v-if", true), + (_ctx.taskOrchestration.planWarnings.length) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "task-warning-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.taskOrchestration.planWarnings, (warning) => { + return (_openBlock(), _createElementBlock("div", { + key: warning, + class: "task-warning-item" + }, _toDisplayString(warning), 1 /* TEXT */)) + }), 128 /* KEYED_FRAGMENT */)) + ])) + : _createCommentVNode("v-if", true), + (_ctx.taskOrchestration.plan) + ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [ + _createElementVNode("div", { class: "task-plan-summary-strip" }, [ + _createElementVNode("div", { class: "task-plan-summary-item" }, [ + _createElementVNode("span", { class: "task-plan-summary-label" }, _toDisplayString(_ctx.t('orchestration.plan.summary.nodes')), 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.taskOrchestration.plan.nodes.length), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "task-plan-summary-item" }, [ + _createElementVNode("span", { class: "task-plan-summary-label" }, _toDisplayString(_ctx.t('orchestration.plan.summary.waves')), 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.taskOrchestration.plan.waves.length), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "task-plan-summary-item" }, [ + _createElementVNode("span", { class: "task-plan-summary-label" }, _toDisplayString(_ctx.t('orchestration.plan.summary.engine')), 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.taskOrchestration.plan.engine), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "task-wave-list" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.taskOrchestration.plan.waves, (wave) => { + return (_openBlock(), _createElementBlock("div", { + key: wave.label, + class: "task-wave-card" + }, [ + _createElementVNode("div", { class: "task-wave-title" }, _toDisplayString(wave.label), 1 /* TEXT */), + _createElementVNode("div", { class: "task-wave-nodes" }, _toDisplayString(wave.nodeIds.join(', ')), 1 /* TEXT */) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ]), + _createElementVNode("div", { class: "task-node-list" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.taskOrchestration.plan.nodes, (node) => { + return (_openBlock(), _createElementBlock("div", { + key: node.id, + class: "task-node-card" + }, [ + _createElementVNode("div", { class: "task-node-head" }, [ + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "task-node-title" }, _toDisplayString(node.title || node.id), 1 /* TEXT */), + _createElementVNode("div", { class: "task-node-meta" }, [ + _createTextVNode(_toDisplayString(node.id) + " · " + _toDisplayString(node.kind), 1 /* TEXT */), + (node.workflowId) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, " · " + _toDisplayString(node.workflowId), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ]), + _createElementVNode("span", { + class: _normalizeClass(['pill', node.write ? 'configured' : 'empty']) + }, _toDisplayString(node.write ? _ctx.t('orchestration.plan.node.write') : _ctx.t('orchestration.plan.node.readOnly')), 3 /* TEXT, CLASS */) + ]), + _createElementVNode("div", { class: "task-node-deps" }, _toDisplayString(_ctx.t('orchestration.labels.dependencies')) + _toDisplayString(_ctx.formatTaskNodeDependencies(node)), 1 /* TEXT */) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ], 64 /* STABLE_FRAGMENT */)) + : _createCommentVNode("v-if", true) + ])) + : _createCommentVNode("v-if", true), + (_ctx.taskOrchestration.queue.length || _ctx.taskOrchestration.runs.length || _ctx.taskOrchestration.selectedRunId || _ctx.taskOrchestration.selectedRunError) + ? (_openBlock(), _createElementBlock("section", { + key: 1, + class: "selector-section task-workbench-card" + }, [ + _createElementVNode("div", { class: "selector-header task-section-header" }, [ + _createElementVNode("div", null, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('orchestration.workbench.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-panel-note" }, _toDisplayString(_ctx.t('orchestration.workbench.subtitle')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "settings-tab-actions task-header-actions" }, [ + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.loadTaskOrchestrationOverview({ forceRefresh: true, includeDetail: true })), + disabled: _ctx.taskOrchestration.loading + }, _toDisplayString(_ctx.taskOrchestration.loading ? _ctx.t('common.refreshing') : _ctx.t('common.refresh')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + (_ctx.taskOrchestration.queue.length) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.startTaskQueueRunner()), + disabled: _ctx.taskOrchestration.queueStarting + }, _toDisplayString(_ctx.taskOrchestration.queueStarting ? _ctx.t('orchestration.queue.starting') : _ctx.t('orchestration.queue.start')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])) + : _createCommentVNode("v-if", true) + ]) + ]), + ((_ctx.taskOrchestration.queue.length ? 1 : 0) + (_ctx.taskOrchestration.runs.length ? 1 : 0) + ((_ctx.taskOrchestration.selectedRunId || _ctx.taskOrchestration.selectedRunError) ? 1 : 0) > 1) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-workbench-tabs", + role: "group", + "aria-label": _ctx.t('orchestration.workbench.tabs.aria') + }, [ + (_ctx.taskOrchestration.queue.length) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + type: "button", + class: _normalizeClass(["task-workbench-tab", { active: _ctx.taskOrchestration.workspaceTab === 'queue' }]), + onClick: $event => (_ctx.taskOrchestration.workspaceTab = 'queue') + }, _toDisplayString(_ctx.t('orchestration.workbench.tabs.queue', { count: _ctx.taskOrchestration.queue.length })), 11 /* TEXT, CLASS, PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + (_ctx.taskOrchestration.runs.length) + ? (_openBlock(), _createElementBlock("button", { + key: 1, + type: "button", + class: _normalizeClass(["task-workbench-tab", { active: _ctx.taskOrchestration.workspaceTab === 'runs' }]), + onClick: $event => (_ctx.taskOrchestration.workspaceTab = 'runs') + }, _toDisplayString(_ctx.t('orchestration.workbench.tabs.runs', { count: _ctx.taskOrchestration.runs.length })), 11 /* TEXT, CLASS, PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + (_ctx.taskOrchestration.selectedRunId || _ctx.taskOrchestration.selectedRunError) + ? (_openBlock(), _createElementBlock("button", { + key: 2, + type: "button", + class: _normalizeClass(["task-workbench-tab", { active: _ctx.taskOrchestration.workspaceTab === 'detail' }]), + onClick: $event => (_ctx.taskOrchestration.workspaceTab = 'detail') + }, _toDisplayString(_ctx.t('orchestration.workbench.tabs.detail')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true) + ], 8 /* PROPS */, ["aria-label"])) + : _createCommentVNode("v-if", true), + (_ctx.taskOrchestration.workspaceTab === 'queue' || (!_ctx.taskOrchestration.runs.length && !_ctx.taskOrchestration.selectedRunId && !_ctx.taskOrchestration.selectedRunError)) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "task-workbench-panel" + }, [ + (!_ctx.taskOrchestration.queue.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-empty-state" + }, [ + _createElementVNode("div", { class: "task-empty-title" }, _toDisplayString(_ctx.t('orchestration.queue.empty.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "task-empty-copy" }, _toDisplayString(_ctx.t('orchestration.queue.empty.subtitle')), 1 /* TEXT */) + ])) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "task-runtime-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.taskOrchestration.queue, (item) => { + return (_openBlock(), _createElementBlock("div", { + key: item.taskId, + class: _normalizeClass(['task-runtime-item', { active: item.lastRunId && _ctx.taskOrchestration.selectedRunId === item.lastRunId, clickable: !!item.lastRunId }]), + role: item.lastRunId ? 'button' : null, + tabindex: item.lastRunId ? 0 : -1, + "aria-disabled": item.lastRunId ? null : 'true', + onClick: $event => (item.lastRunId ? (_ctx.taskOrchestration.workspaceTab = 'detail', _ctx.selectTaskRun(item.lastRunId)) : null), + onKeydown: [ + _withKeys(_withModifiers($event => (item.lastRunId ? (_ctx.taskOrchestration.workspaceTab = 'detail', _ctx.selectTaskRun(item.lastRunId)) : null), ["self","prevent"]), ["enter"]), + _withKeys(_withModifiers($event => (item.lastRunId ? (_ctx.taskOrchestration.workspaceTab = 'detail', _ctx.selectTaskRun(item.lastRunId)) : null), ["self","prevent"]), ["space"]) + ] + }, [ + _createElementVNode("div", { class: "task-runtime-item-main" }, [ + _createElementVNode("div", { class: "task-runtime-item-title" }, _toDisplayString(item.title || item.target || item.taskId), 1 /* TEXT */), + _createElementVNode("div", { class: "task-runtime-item-meta" }, _toDisplayString(item.taskId) + " · " + _toDisplayString(item.updatedAt || item.createdAt), 1 /* TEXT */), + (item.lastSummary) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-runtime-item-summary" + }, _toDisplayString(item.lastSummary), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "task-runtime-item-actions" }, [ + _createElementVNode("span", { + class: _normalizeClass(['pill', _ctx.taskRunStatusTone(item.status)]) + }, _toDisplayString(item.status), 3 /* TEXT, CLASS */), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: _withModifiers($event => (_ctx.cancelTaskRunFromUi(item.taskId)), ["stop"]), + disabled: item.status !== 'queued' && item.status !== 'running' + }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["role", "tabindex", "aria-disabled", "onClick", "onKeydown"])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ])) + : (_ctx.taskOrchestration.workspaceTab === 'runs' || (!_ctx.taskOrchestration.queue.length && _ctx.taskOrchestration.runs.length && !_ctx.taskOrchestration.selectedRunId && !_ctx.taskOrchestration.selectedRunError)) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "task-workbench-panel" + }, [ + (!_ctx.taskOrchestration.runs.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-empty-state" + }, [ + _createElementVNode("div", { class: "task-empty-title" }, _toDisplayString(_ctx.t('orchestration.runs.empty.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "task-empty-copy" }, _toDisplayString(_ctx.t('orchestration.runs.empty.subtitle')), 1 /* TEXT */) + ])) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "task-runtime-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.taskOrchestration.runs, (item) => { + return (_openBlock(), _createElementBlock("button", { + key: item.runId, + type: "button", + class: _normalizeClass(['task-runtime-item', { active: _ctx.taskOrchestration.selectedRunId === item.runId }]), + onClick: $event => {_ctx.taskOrchestration.workspaceTab = 'detail'; _ctx.selectTaskRun(item.runId)} + }, [ + _createElementVNode("div", { class: "task-runtime-item-main" }, [ + _createElementVNode("div", { class: "task-runtime-item-title" }, _toDisplayString(item.title || item.taskId || item.runId), 1 /* TEXT */), + _createElementVNode("div", { class: "task-runtime-item-meta" }, _toDisplayString(item.runId) + " · " + _toDisplayString(item.durationMs || 0) + "ms", 1 /* TEXT */), + (item.summary) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-runtime-item-summary" + }, _toDisplayString(item.summary), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "task-runtime-item-actions" }, [ + _createElementVNode("span", { + class: _normalizeClass(['pill', _ctx.taskRunStatusTone(item.status)]) + }, _toDisplayString(item.status), 3 /* TEXT, CLASS */) + ]) + ], 10 /* CLASS, PROPS */, ["onClick"])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ])) + : (_openBlock(), _createElementBlock("div", { + key: 3, + class: "task-workbench-panel" + }, [ + _createElementVNode("div", { class: "task-detail-toolbar settings-tab-actions" }, [ + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.taskOrchestration.selectedRunId ? _ctx.loadTaskRunDetail(_ctx.taskOrchestration.selectedRunId) : null), + disabled: !_ctx.taskOrchestration.selectedRunId || _ctx.taskOrchestration.selectedRunLoading + }, _toDisplayString(_ctx.taskOrchestration.selectedRunLoading ? _ctx.t('common.refreshing') : _ctx.t('orchestration.detail.refresh')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.retryTaskRunFromUi(_ctx.taskOrchestration.selectedRunId)), + disabled: !_ctx.taskOrchestration.selectedRunId || _ctx.taskOrchestration.retrying + }, _toDisplayString(_ctx.taskOrchestration.retrying ? _ctx.t('orchestration.detail.retrying') : _ctx.t('orchestration.detail.retry')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.cancelTaskRunFromUi(_ctx.taskOrchestration.selectedRunId)), + disabled: !_ctx.taskOrchestrationSelectedRun || !_ctx.taskOrchestrationSelectedRun.run || !_ctx.isTaskRunActive(_ctx.taskOrchestrationSelectedRun.run.status) + }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]), + (_ctx.taskOrchestration.selectedRunError) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-issue-item" + }, _toDisplayString(_ctx.taskOrchestration.selectedRunError), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (!_ctx.taskOrchestrationSelectedRun) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "task-empty-state" + }, [ + _createElementVNode("div", { class: "task-empty-title" }, _toDisplayString(_ctx.t('orchestration.detail.empty.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "task-empty-copy" }, _toDisplayString(_ctx.t('orchestration.detail.empty.subtitle')), 1 /* TEXT */) + ])) + : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [ + _createElementVNode("div", { class: "task-detail-summary-strip" }, [ + _createElementVNode("div", { class: "task-plan-summary-item" }, [ + _createElementVNode("span", { class: "task-plan-summary-label" }, _toDisplayString(_ctx.t('orchestration.detail.summary.status')), 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.taskOrchestrationSelectedRun.run.status), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "task-plan-summary-item" }, [ + _createElementVNode("span", { class: "task-plan-summary-label" }, _toDisplayString(_ctx.t('orchestration.detail.summary.duration')), 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.taskOrchestrationSelectedRun.run.durationMs || 0) + "ms", 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "task-plan-summary-item" }, [ + _createElementVNode("span", { class: "task-plan-summary-label" }, _toDisplayString(_ctx.t('orchestration.detail.summary.nodes')), 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.taskOrchestrationSelectedRunNodes.length), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "task-plan-summary-item" }, [ + _createElementVNode("span", { class: "task-plan-summary-label" }, _toDisplayString(_ctx.t('orchestration.detail.summary.summary')), 1 /* TEXT */), + _createElementVNode("strong", null, _toDisplayString(_ctx.taskOrchestrationSelectedRun.run.summary || _ctx.t('common.none')), 1 /* TEXT */) + ]) + ]), + (_ctx.taskOrchestrationSelectedRun.run.error) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-issue-item" + }, _toDisplayString(_ctx.taskOrchestrationSelectedRun.run.error), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "task-node-list" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.taskOrchestrationSelectedRunNodes, (node) => { + return (_openBlock(), _createElementBlock("div", { + key: node.id, + class: "task-node-card task-node-card-detail" + }, [ + _createElementVNode("div", { class: "task-node-head" }, [ + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "task-node-title" }, _toDisplayString(node.title || node.id), 1 /* TEXT */), + _createElementVNode("div", { class: "task-node-meta" }, _toDisplayString(_ctx.t('orchestration.detail.node.meta', { id: node.id, attempts: (node.attemptCount || 0), autoFix: (node.autoFixRounds || 0) })), 1 /* TEXT */) + ]), + _createElementVNode("span", { + class: _normalizeClass(['pill', _ctx.taskRunStatusTone(node.status)]) + }, _toDisplayString(node.status), 3 /* TEXT, CLASS */) + ]), + (node.summary) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "task-runtime-item-summary" + }, _toDisplayString(node.summary), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (node.error && node.error !== node.summary) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "task-node-deps" + }, _toDisplayString(_ctx.t('orchestration.labels.error')) + _toDisplayString(node.error), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "task-node-deps" }, _toDisplayString(_ctx.t('orchestration.labels.dependencies')) + _toDisplayString(_ctx.formatTaskNodeDependencies(node)), 1 /* TEXT */), + _createElementVNode("pre", { class: "task-log-block" }, _toDisplayString(_ctx.formatTaskNodeLogs(node.logs)), 1 /* TEXT */) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ], 64 /* STABLE_FRAGMENT */)) + ])) + ])) + : _createCommentVNode("v-if", true) + ])) + ], 512 /* NEED_PATCH */)), [ + [_vShow, _ctx.mainTab === 'orchestration'] + ]) + : _createCommentVNode("v-if", true), + _withDirectives(_createElementVNode("div", { + class: "mode-content docs-mode-content", + id: "panel-docs", + role: "tabpanel", + "aria-labelledby": "tab-docs" + }, [ + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('docs.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-panel-note docs-section-note" }, _toDisplayString(_ctx.t('docs.subtitle')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "docs-toolbar-grid" }, [ + _createElementVNode("div", { class: "docs-toolbar-card" }, [ + _createElementVNode("label", { + class: "form-label", + for: "docs-install-package-manager" + }, _toDisplayString(_ctx.t('common.packageManager')), 1 /* TEXT */), + _withDirectives(_createElementVNode("select", { + id: "docs-install-package-manager", + class: "form-input", + "onUpdate:modelValue": $event => ((_ctx.installPackageManager) = $event) + }, [ + _createElementVNode("option", { value: "npm" }, "npm"), + _createElementVNode("option", { value: "pnpm" }, "pnpm"), + _createElementVNode("option", { value: "bun" }, "bun") + ], 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelSelect, _ctx.installPackageManager] + ]) + ]), + _createElementVNode("div", { class: "docs-toolbar-card docs-toolbar-card-wide" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('common.mirror')), 1 /* TEXT */), + _createElementVNode("div", { class: "install-action-tabs" }, [ + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["btn-mini", { active: _ctx.installRegistryPreset === 'default' }]), + onClick: $event => (_ctx.setInstallRegistryPreset('default')) + }, _toDisplayString(_ctx.t('common.official')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["btn-mini", { active: _ctx.installRegistryPreset === 'npmmirror' }]), + onClick: $event => (_ctx.setInstallRegistryPreset('npmmirror')) + }, "npmmirror", 10 /* CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["btn-mini", { active: _ctx.installRegistryPreset === 'tencent' }]), + onClick: $event => (_ctx.setInstallRegistryPreset('tencent')) + }, _toDisplayString(_ctx.t('docs.registry.tencent')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["btn-mini", { active: _ctx.installRegistryPreset === 'custom' }]), + onClick: $event => (_ctx.setInstallRegistryPreset('custom')) + }, _toDisplayString(_ctx.t('common.custom')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]) + ]), + (_ctx.installRegistryPreset === 'custom') + ? _withDirectives((_openBlock(), _createElementBlock("input", { + key: 0, + "onUpdate:modelValue": $event => ((_ctx.installRegistryCustom) = $event), + class: "form-input install-registry-input", + placeholder: "https://registry.example.com" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"])), [ + [_vModelText, _ctx.installRegistryCustom] + ]) + : _createCommentVNode("v-if", true), + (_ctx.installRegistryPreview) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "form-hint install-registry-hint" + }, _toDisplayString(_ctx.t('docs.registryHintPrefix')) + " --registry=" + _toDisplayString(_ctx.installRegistryPreview), 1 /* TEXT */)) + : (_ctx.installRegistryPreset === 'custom') + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "form-hint install-registry-hint" + }, _toDisplayString(_ctx.t('docs.registryHintCustom')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "docs-toolbar-card docs-toolbar-card-wide" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('common.action')), 1 /* TEXT */), + _createElementVNode("div", { class: "install-action-tabs" }, [ + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["btn-mini", { active: _ctx.installCommandAction === 'install' }]), + onClick: $event => (_ctx.setInstallCommandAction('install')) + }, _toDisplayString(_ctx.t('common.install')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["btn-mini", { active: _ctx.installCommandAction === 'update' }]), + onClick: $event => (_ctx.setInstallCommandAction('update')) + }, _toDisplayString(_ctx.t('common.update')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(["btn-mini", { active: _ctx.installCommandAction === 'uninstall' }]), + onClick: $event => (_ctx.setInstallCommandAction('uninstall')) + }, _toDisplayString(_ctx.t('common.uninstall')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]) + ]) + ]) + ]), + _createElementVNode("div", { class: "docs-summary-strip" }, [ + _createElementVNode("div", { class: "docs-summary-item" }, [ + _createElementVNode("span", { class: "docs-summary-label" }, _toDisplayString(_ctx.t('common.targets')), 1 /* TEXT */), + _createElementVNode("strong", { class: "docs-summary-value" }, _toDisplayString(_ctx.installTargetCards.length), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "docs-summary-item" }, [ + _createElementVNode("span", { class: "docs-summary-label" }, _toDisplayString(_ctx.t('common.currentPm')), 1 /* TEXT */), + _createElementVNode("strong", { class: "docs-summary-value" }, _toDisplayString(String(_ctx.installPackageManager || 'npm').toUpperCase()), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "docs-summary-item docs-summary-item-wide" }, [ + _createElementVNode("span", { class: "docs-summary-label" }, _toDisplayString(_ctx.t('common.registry')), 1 /* TEXT */), + _createElementVNode("strong", { class: "docs-summary-value" }, _toDisplayString(_ctx.installRegistryPreview || _ctx.t('common.defaultOfficial')), 1 /* TEXT */) + ]) + ]) + ]), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('docs.section.commands')), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-panel-note docs-section-note" }, _toDisplayString(_ctx.t('docs.section.commandsNote')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "install-list docs-install-list" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.installTargetCards, (target) => { + return (_openBlock(), _createElementBlock("div", { + class: "install-row docs-install-row", + key: 'docs-install-command-' + target.id + '-' + _ctx.installCommandAction + }, [ + _createElementVNode("div", { class: "install-row-main" }, [ + _createElementVNode("div", { class: "docs-command-head" }, [ + _createElementVNode("div", { class: "install-row-title" }, _toDisplayString(target.name), 1 /* TEXT */), + _createElementVNode("div", { class: "docs-command-meta" }, [ + _createElementVNode("span", { class: "docs-meta-pill" }, _toDisplayString(target.packageName), 1 /* TEXT */), + _createElementVNode("span", { class: "docs-meta-pill" }, "bin: " + _toDisplayString(target.bin), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "docs-command-row" }, [ + _createElementVNode("div", { + class: "docs-command-box", + role: "group", + "aria-label": _ctx.t('docs.command.aria', { name: target.name }) + }, [ + _createElementVNode("code", { class: "install-command" }, _toDisplayString(target.command), 1 /* TEXT */), + _createElementVNode("button", { + type: "button", + class: "btn-mini docs-copy-btn", + disabled: !target.command, + onClick: $event => (_ctx.copyInstallCommand(target.command)) + }, _toDisplayString(_ctx.t('common.copy')), 9 /* TEXT, PROPS */, ["disabled", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]) + ]), + (target.id === 'codex' && target.termuxCommand && target.termuxCommand !== target.command) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "docs-command-row docs-command-row-secondary" + }, [ + _createElementVNode("div", { + class: "docs-command-box", + role: "group", + "aria-label": _ctx.t('docs.termuxAria') + }, [ + _createElementVNode("code", { class: "install-command" }, [ + _createElementVNode("span", { class: "docs-command-prefix" }, _toDisplayString(_ctx.t('docs.termuxLabel')), 1 /* TEXT */), + _createTextVNode(_toDisplayString(target.termuxCommand), 1 /* TEXT */) + ]), + _createElementVNode("button", { + type: "button", + class: "btn-mini docs-copy-btn", + onClick: $event => (_ctx.copyInstallCommand(target.termuxCommand)) + }, _toDisplayString(_ctx.t('common.copy')), 9 /* TEXT, PROPS */, ["onClick"]) + ], 8 /* PROPS */, ["aria-label"]) + ])) + : _createCommentVNode("v-if", true) + ]) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ]), + _createElementVNode("div", { class: "selector-section" }, [ + _createElementVNode("div", { class: "selector-header" }, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('docs.section.faq')), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-panel-note docs-section-note" }, _toDisplayString(_ctx.t('docs.section.faqNote')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "docs-help-grid" }, [ + _createElementVNode("div", { class: "docs-note-card" }, [ + _createElementVNode("div", { class: "docs-note-title" }, _toDisplayString(_ctx.t('common.troubleshooting')), 1 /* TEXT */), + _createElementVNode("ul", { class: "install-help-list docs-help-list" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.installTroubleshootingTips, (tip) => { + return (_openBlock(), _createElementBlock("li", { key: tip }, _toDisplayString(tip), 1 /* TEXT */)) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ]), + _createElementVNode("div", { class: "docs-note-card" }, [ + _createElementVNode("div", { class: "docs-note-title" }, _toDisplayString(_ctx.t('common.rules')), 1 /* TEXT */), + _createElementVNode("ul", { class: "docs-static-list" }, [ + _createElementVNode("li", null, _toDisplayString(_ctx.t('docs.rule.1')), 1 /* TEXT */), + _createElementVNode("li", null, _toDisplayString(_ctx.t('docs.rule.2')), 1 /* TEXT */) + ]) + ]) + ]) + ]) + ], 512 /* NEED_PATCH */), [ + [_vShow, _ctx.mainTab === 'docs'] + ]), + _createCommentVNode(" 设置面板 "), + _withDirectives(_createElementVNode("div", { + class: "mode-content", + id: "panel-settings", + role: "tabpanel", + "aria-labelledby": 'tab-settings' + }, [ + _createElementVNode("div", { class: "settings-tab-header" }, [ + _createElementVNode("div", { + class: "segmented-control", + role: "tablist", + "aria-label": _ctx.t('settings.tabs.aria') + }, [ + _createElementVNode("button", { + id: "settings-tab-general", + type: "button", + role: "tab", + "aria-controls": "settings-panel-general", + "aria-selected": _ctx.settingsTab === 'general', + tabindex: _ctx.settingsTab === 'general' ? 0 : -1, + class: _normalizeClass(['segmented-option', { active: _ctx.settingsTab === 'general' }]), + onClick: $event => (_ctx.onSettingsTabClick('general')), + onKeydown: $event => (_ctx.onSettingsTabKeydown($event, 'general')) + }, _toDisplayString(_ctx.t('settings.tab.general')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["aria-selected", "tabindex", "onClick", "onKeydown"]), + _createElementVNode("button", { + id: "settings-tab-data", + type: "button", + role: "tab", + "aria-controls": "settings-panel-data", + "aria-selected": _ctx.settingsTab === 'data', + tabindex: _ctx.settingsTab === 'data' ? 0 : -1, + class: _normalizeClass(['segmented-option', { active: _ctx.settingsTab === 'data' }]), + onClick: $event => (_ctx.onSettingsTabClick('data')), + onKeydown: $event => (_ctx.onSettingsTabKeydown($event, 'data')) + }, _toDisplayString(_ctx.t('settings.tab.data')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["aria-selected", "tabindex", "onClick", "onKeydown"]) + ], 8 /* PROPS */, ["aria-label"]) + ]), + _withDirectives(_createElementVNode("div", { + id: "settings-panel-general", + role: "tabpanel", + "aria-labelledby": "settings-tab-general" + }, [ + _createElementVNode("div", { class: "settings-grid" }, [ + _createElementVNode("section", { + class: "settings-card", + "aria-label": _ctx.t('settings.sharePrefix.title') + }, [ + _createElementVNode("div", { class: "settings-card-main" }, [ + _createElementVNode("div", { class: "settings-card-content" }, [ + _createElementVNode("div", { class: "settings-card-title" }, _toDisplayString(_ctx.t('settings.sharePrefix.title')), 1 /* TEXT */), + _createElementVNode("p", { class: "settings-card-desc" }, _toDisplayString(_ctx.t('settings.sharePrefix.meta')), 1 /* TEXT */), + _createElementVNode("label", { + class: "selector-label", + for: "settings-share-prefix" + }, _toDisplayString(_ctx.t('settings.sharePrefix.label')), 1 /* TEXT */), + _createElementVNode("select", { + id: "settings-share-prefix", + class: "model-select", + value: _ctx.shareCommandPrefix, + onChange: $event => (_ctx.setShareCommandPrefix($event.target.value)) + }, [ + _createElementVNode("option", { value: "npm start" }, "npm start"), + _createElementVNode("option", { value: "codexmate" }, "codexmate") + ], 40 /* PROPS, NEED_HYDRATION */, ["value", "onChange"]), + _createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.sharePrefix.hint')), 1 /* TEXT */) + ]) + ]) + ], 8 /* PROPS */, ["aria-label"]), + _createElementVNode("section", { + class: "settings-card", + "aria-label": _ctx.t('settings.templateConfirm.title') + }, [ + _createElementVNode("div", { class: "settings-card-main" }, [ + _createElementVNode("div", { class: "settings-card-content" }, [ + _createElementVNode("div", { class: "settings-card-title" }, _toDisplayString(_ctx.t('settings.templateConfirm.title')), 1 /* TEXT */), + _createElementVNode("p", { class: "settings-card-desc" }, _toDisplayString(_ctx.t('settings.templateConfirm.meta')), 1 /* TEXT */), + _createElementVNode("label", { class: "settings-toggle-row" }, [ + _createElementVNode("input", { + type: "checkbox", + checked: _ctx.configTemplateDiffConfirmEnabled, + onChange: $event => (_ctx.setConfigTemplateDiffConfirmEnabled($event.target.checked)) + }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]), + _createElementVNode("span", { class: "toggle-track" }, [ + _createElementVNode("span", { class: "toggle-thumb" }) + ]), + _createElementVNode("span", null, _toDisplayString(_ctx.t('settings.templateConfirm.toggle')), 1 /* TEXT */) + ]), + _createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.templateConfirm.hint')), 1 /* TEXT */) + ]) + ]) + ], 8 /* PROPS */, ["aria-label"]), + _createElementVNode("section", { + class: "settings-card", + "aria-label": 'Webhook' + }, [ + _createElementVNode("div", { class: "settings-card-main" }, [ + _createElementVNode("div", { class: "settings-card-content" }, [ + _createElementVNode("div", { class: "settings-card-title" }, "Webhook"), + _createElementVNode("p", { class: "settings-card-desc" }, "配置变更时外发通知"), + _createElementVNode("div", { class: "webhook-status" }, [ + _createElementVNode("span", { + class: _normalizeClass(["webhook-status-dot", { active: _ctx.webhookConfig.enabled }]) + }, null, 2 /* CLASS */), + _createElementVNode("span", { class: "webhook-status-label" }, _toDisplayString(_ctx.webhookConfig.enabled ? '已启用' : '已禁用'), 1 /* TEXT */), + (_ctx.webhookConfig.url) + ? (_openBlock(), _createElementBlock("code", { + key: 0, + class: "webhook-url" + }, _toDisplayString(_ctx.webhookConfig.url), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ]) + ]), + _createElementVNode("button", { + class: _normalizeClass(["settings-card-action", { 'settings-card-action--active': _ctx.webhookConfig.enabled }]), + onClick: _ctx.openWebhookModal + }, [ + (_ctx.webhookConfig.enabled) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(_ctx.webhookConfig.url ? '编辑' : '配置'), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("span", { key: 1 }, "启用")) + ], 10 /* CLASS, PROPS */, ["onClick"]) + ]) + ]) + ], 512 /* NEED_PATCH */), [ + [_vShow, _ctx.settingsTab === 'general'] + ]), + _withDirectives(_createElementVNode("div", { + id: "settings-panel-data", + role: "tabpanel", + "aria-labelledby": "settings-tab-data" + }, [ + _createElementVNode("div", { class: "settings-grid" }, [ + _createElementVNode("section", { + class: "settings-card", + "aria-label": _ctx.t('settings.backup.title') + }, [ + _createElementVNode("div", { class: "settings-card-main" }, [ + _createElementVNode("div", { class: "settings-card-content" }, [ + _createElementVNode("div", { class: "settings-card-title" }, _toDisplayString(_ctx.t('settings.backup.title')), 1 /* TEXT */), + _createElementVNode("p", { class: "settings-card-desc" }, _toDisplayString(_ctx.t('settings.backup.meta')), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "settings-card-actions" }, [ + _createElementVNode("button", { + class: "settings-card-action", + onClick: _ctx.downloadClaudeDirectory, + disabled: _ctx.claudeDownloadLoading + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.claudeDownloadLoading ? _ctx.t('settings.importing') : _ctx.t('settings.backup.oneClickClaude')), 1 /* TEXT */) + ], 8 /* PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + class: "settings-card-action", + onClick: _ctx.downloadCodexDirectory, + disabled: _ctx.codexDownloadLoading + }, [ + _createElementVNode("span", null, _toDisplayString(_ctx.codexDownloadLoading ? _ctx.t('settings.importing') : _ctx.t('settings.backup.oneClickCodex')), 1 /* TEXT */) + ], 8 /* PROPS */, ["onClick", "disabled"]) + ]), + _createElementVNode("input", { + ref: "claudeImportInput", + class: "sr-only", + type: "file", + accept: ".zip", + onChange: _ctx.handleClaudeImportChange + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onChange"]), + _createElementVNode("input", { + ref: "codexImportInput", + class: "sr-only", + type: "file", + accept: ".zip", + onChange: _ctx.handleCodexImportChange + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onChange"]) + ], 8 /* PROPS */, ["aria-label"]), + _createElementVNode("section", { + class: "settings-card", + "aria-label": _ctx.t('settings.trashConfig.title') + }, [ + _createElementVNode("div", { class: "settings-card-main" }, [ + _createElementVNode("div", { class: "settings-card-content" }, [ + _createElementVNode("div", { class: "settings-card-title" }, _toDisplayString(_ctx.t('settings.trashConfig.title')), 1 /* TEXT */), + _createElementVNode("p", { class: "settings-card-desc" }, _toDisplayString(_ctx.t('settings.trashConfig.meta')), 1 /* TEXT */), + _createElementVNode("label", { class: "settings-toggle-row" }, [ + _createElementVNode("input", { + type: "checkbox", + checked: _ctx.sessionTrashEnabled, + onChange: $event => (_ctx.setSessionTrashEnabled($event.target.checked)) + }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]), + _createElementVNode("span", { class: "toggle-track" }, [ + _createElementVNode("span", { class: "toggle-thumb" }) + ]), + _createElementVNode("span", null, _toDisplayString(_ctx.t('settings.deleteBehavior.toggle')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "settings-retention" }, [ + _createElementVNode("label", { for: "settings-trash-retention-days" }, _toDisplayString(_ctx.t('settings.trash.retentionLabel')), 1 /* TEXT */), + _createElementVNode("input", { + id: "settings-trash-retention-days", + type: "number", + min: "1", + max: "365", + value: _ctx.sessionTrashRetentionDays, + onChange: $event => (_ctx.setSessionTrashRetentionDays(Number($event.target.value))), + class: "settings-retention-input" + }, null, 40 /* PROPS, NEED_HYDRATION */, ["value", "onChange"]), + _createElementVNode("span", null, "天") + ]), + _createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.trash.retentionHint')), 1 /* TEXT */) + ]) + ]) + ], 8 /* PROPS */, ["aria-label"]), + _createElementVNode("section", { + class: "settings-card settings-card--destructive", + "aria-label": _ctx.t('settings.reset.title') + }, [ + _createElementVNode("div", { class: "settings-card-main" }, [ + _createElementVNode("div", { class: "settings-card-content" }, [ + _createElementVNode("div", { class: "settings-card-title" }, _toDisplayString(_ctx.t('settings.reset.title')), 1 /* TEXT */), + _createElementVNode("p", { class: "settings-card-desc" }, _toDisplayString(_ctx.t('settings.reset.meta')), 1 /* TEXT */), + _createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.reset.hint')), 1 /* TEXT */) + ]) + ]), + _createElementVNode("button", { + class: "settings-card-action settings-card-action--danger", + onClick: _ctx.resetConfig, + disabled: _ctx.resetConfigLoading || _ctx.loading || !!_ctx.initError + }, _toDisplayString(_ctx.resetConfigLoading ? _ctx.t('settings.reset.loading') : _ctx.t('settings.reset.button')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ], 8 /* PROPS */, ["aria-label"]) + ]) + ], 512 /* NEED_PATCH */), [ + [_vShow, _ctx.settingsTab === 'data'] + ]) + ], 512 /* NEED_PATCH */), [ + [_vShow, _ctx.mainTab === 'settings'] + ]), + _createCommentVNode(" 回收站面板 "), + _withDirectives(_createElementVNode("div", { + class: "mode-content", + id: "panel-trash", + role: "tabpanel", + "aria-labelledby": "tab-trash" + }, [ + (!_ctx.loading) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "trash-panel-shell" + }, [ + _createCommentVNode(" 空态 "), + (_ctx.getSessionTrashViewState() === 'empty') + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "trash-empty-state" + }, [ + (_openBlock(), _createElementBlock("svg", { + class: "trash-empty-svg", + viewBox: "0 0 64 64", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.2" + }, [ + _createElementVNode("path", { d: "M20 22l4 32h16l4-32" }), + _createElementVNode("path", { d: "M14 22h36" }), + _createElementVNode("path", { d: "M24 22v-4a4 4 0 014-4h8a4 4 0 014 4v4" }), + _createElementVNode("path", { + d: "M28 30v16M36 30v16", + "stroke-width": "1.6", + "stroke-linecap": "round" + }) + ])), + _createElementVNode("div", { class: "trash-empty-title" }, _toDisplayString(_ctx.t('settings.trash.empty')), 1 /* TEXT */), + _createElementVNode("div", { class: "trash-empty-hint" }, "删除的会话保留 " + _toDisplayString(_ctx.sessionTrashRetentionDays) + " 天后自动清理", 1 /* TEXT */) + ])) + : (_ctx.getSessionTrashViewState() === 'loading') + ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [ + _createCommentVNode(" 加载态 "), + _createElementVNode("div", { class: "trash-empty-state" }, [ + _createElementVNode("div", { class: "trash-spinner" }), + _createElementVNode("div", { class: "trash-empty-title" }, _toDisplayString(_ctx.t('settings.trash.loading')), 1 /* TEXT */) + ]) + ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */)) + : (_ctx.getSessionTrashViewState() === 'retry') + ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [ + _createCommentVNode(" 错误态 "), + _createElementVNode("div", { class: "trash-empty-state" }, [ + (_openBlock(), _createElementBlock("svg", { + class: "trash-empty-svg", + viewBox: "0 0 64 64", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.2" + }, [ + _createElementVNode("circle", { + cx: "32", + cy: "32", + r: "22" + }), + _createElementVNode("path", { + d: "M32 20v16M32 44v2", + "stroke-width": "2", + "stroke-linecap": "round" + }) + ])), + _createElementVNode("div", { class: "trash-empty-title" }, _toDisplayString(_ctx.t('settings.trash.retry')), 1 /* TEXT */), + _createElementVNode("button", { + class: "btn-tool", + onClick: $event => (_ctx.loadSessionTrash({ forceRefresh: true })) + }, "重试", 8 /* PROPS */, ["onClick"]) + ]) + ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */)) + : (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [ + _createCommentVNode(" 列表态 "), + _createElementVNode("div", { class: "trash-toolbar" }, [ + _createElementVNode("div", { class: "trash-toolbar-left" }, [ + _createElementVNode("span", { class: "trash-toolbar-count" }, _toDisplayString(_ctx.sessionTrashCount) + " 个已删除会话", 1 /* TEXT */), + _createElementVNode("span", { class: "trash-toolbar-retention" }, _toDisplayString(_ctx.sessionTrashRetentionDays) + " 天后自动清理", 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "trash-toolbar-right" }, [ + _createElementVNode("button", { + class: "btn-mini", + onClick: $event => (_ctx.loadSessionTrash({ forceRefresh: true })), + disabled: _ctx.sessionTrashLoading, + title: _ctx.t('sessions.refresh') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + class: "btn-icon-sm" + }, [ + _createElementVNode("path", { d: "M21 2v6h-6M3 12a9 9 0 0115-6.7L21 8M3 22v-6h6M21 12a9 9 0 01-15 6.7L3 16" }) + ])) + ], 8 /* PROPS */, ["onClick", "disabled", "title"]), + _createElementVNode("button", { + class: "btn-mini delete", + onClick: _ctx.clearSessionTrash, + disabled: _ctx.sessionTrashClearing || _ctx.sessionTrashLoading || !(Number(_ctx.sessionTrashCount) > 0) + }, _toDisplayString(_ctx.sessionTrashClearing ? '清空中…' : '清空'), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + _createElementVNode("div", { class: "trash-list" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.visibleSessionTrashItems, (item) => { + return (_openBlock(), _createElementBlock("div", { + key: item.trashId, + class: "trash-item" + }, [ + _createElementVNode("div", { class: "trash-item-body" }, [ + _createElementVNode("div", { class: "trash-item-main" }, [ + _createElementVNode("div", { class: "trash-item-title" }, _toDisplayString(item.title || item.sessionId), 1 /* TEXT */), + _createElementVNode("div", { class: "trash-item-meta" }, [ + _createElementVNode("span", { + class: "session-source", + "data-source": item.source + }, _toDisplayString(item.sourceLabel), 9 /* TEXT, PROPS */, ["data-source"]), + _createElementVNode("span", { class: "trash-item-time" }, _toDisplayString(item.deletedAt || item.updatedAt || _ctx.t('sessions.unknownTime')), 1 /* TEXT */), + (item.cwd) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: "trash-item-cwd" + }, _toDisplayString(item.cwd), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ]), + _createElementVNode("div", { class: "trash-item-actions" }, [ + _createElementVNode("button", { + class: "trash-action-btn restore", + onClick: $event => (_ctx.restoreSessionTrash(item)), + disabled: _ctx.sessionTrashLoading || _ctx.sessionTrashClearing || _ctx.isSessionTrashActionBusy(item), + title: _ctx.sessionTrashRestoring[_ctx.getSessionTrashActionKey(item)] ? '恢复中…' : '恢复' + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M3 12a9 9 0 119 9" }), + _createElementVNode("path", { d: "M3 4v6h6" }) + ])) + ], 8 /* PROPS */, ["onClick", "disabled", "title"]), + _createElementVNode("button", { + class: "trash-action-btn delete", + onClick: $event => (_ctx.purgeSessionTrash(item)), + disabled: _ctx.sessionTrashLoading || _ctx.sessionTrashClearing || _ctx.isSessionTrashActionBusy(item), + title: _ctx.sessionTrashPurging[_ctx.getSessionTrashActionKey(item)] ? '删除中…' : '彻底删除' + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2" + }, [ + _createElementVNode("path", { d: "M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6M10 11v6M14 11v6" }) + ])) + ], 8 /* PROPS */, ["onClick", "disabled", "title"]) + ]) + ]) + ])) + }), 128 /* KEYED_FRAGMENT */)), + (_ctx.sessionTrashHasMoreItems) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "trash-list-footer" + }, [ + _createElementVNode("button", { + class: "btn-tool btn-tool-compact", + onClick: _ctx.loadMoreSessionTrashItems, + disabled: _ctx.sessionTrashLoading || _ctx.sessionTrashClearing + }, " 加载更多(" + _toDisplayString(_ctx.sessionTrashHiddenCount) + " 条) ", 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ])) + : _createCommentVNode("v-if", true) + ]) + ], 64 /* STABLE_FRAGMENT */)) + ])) + : _createCommentVNode("v-if", true) + ], 512 /* NEED_PATCH */), [ + [_vShow, _ctx.mainTab === 'trash'] + ]), + _withDirectives(_createElementVNode("div", { + class: "mode-content", + id: "panel-market", + role: "tabpanel", + "aria-labelledby": "tab-market" + }, [ + _createCommentVNode(" Minimalist header with target switch "), + _createElementVNode("div", { class: "skills-minimal-header" }, [ + _createElementVNode("div", { class: "skills-header-left" }, [ + _createElementVNode("span", { class: "skills-header-title" }, _toDisplayString(_ctx.t('market.title')), 1 /* TEXT */), + _createElementVNode("div", { + class: "skills-target-switch", + role: "group", + "aria-label": _ctx.t('market.target.aria') + }, [ + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['skills-target-chip', { active: _ctx.skillsTargetApp === 'codex' }]), + "aria-pressed": _ctx.skillsTargetApp === 'codex', + disabled: _ctx.loading || !!_ctx.initError || _ctx.skillsMarketBusy, + onClick: $event => (_ctx.setSkillsTargetApp('codex', { silent: false })) + }, " Codex ", 10 /* CLASS, PROPS */, ["aria-pressed", "disabled", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['skills-target-chip', { active: _ctx.skillsTargetApp === 'claude' }]), + "aria-pressed": _ctx.skillsTargetApp === 'claude', + disabled: _ctx.loading || !!_ctx.initError || _ctx.skillsMarketBusy, + onClick: $event => (_ctx.setSkillsTargetApp('claude', { silent: false })) + }, " Claude Code ", 10 /* CLASS, PROPS */, ["aria-pressed", "disabled", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]) + ]), + _createElementVNode("div", { class: "skills-header-actions" }, [ + _createElementVNode("button", { + type: "button", + class: "btn-icon", + onClick: _ctx.openSkillsMenu, + "aria-label": _ctx.t('common.menu'), + title: _ctx.t('common.menu') + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + width: "20", + height: "20" + }, [ + _createElementVNode("circle", { + cx: "12", + cy: "12", + r: "1" + }), + _createElementVNode("circle", { + cx: "12", + cy: "5", + r: "1" + }), + _createElementVNode("circle", { + cx: "12", + cy: "19", + r: "1" + }) + ])) + ], 8 /* PROPS */, ["onClick", "aria-label", "title"]) + ]) + ]), + _createCommentVNode(" Installed skills panel "), + _createElementVNode("div", { class: "skills-flow-panel" }, [ + _createElementVNode("div", { class: "skills-flow-header" }, [ + _createElementVNode("div", { class: "skills-flow-title-wrap" }, [ + _createElementVNode("span", { class: "skills-flow-title" }, _toDisplayString(_ctx.t('market.installed.title')), 1 /* TEXT */), + _createElementVNode("span", { class: "skills-flow-count" }, _toDisplayString(_ctx.skillsList.length), 1 /* TEXT */) + ]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => (_ctx.refreshSkillsList({ silent: false })), + disabled: _ctx.loading || !!_ctx.initError || _ctx.skillsMarketBusy + }, [ + (!_ctx.skillsLoading) + ? (_openBlock(), _createElementBlock("svg", { + key: 0, + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.8", + width: "14", + height: "14" + }, [ + _createElementVNode("path", { d: "M17 1l4 4-4 4" }), + _createElementVNode("path", { d: "M3 11V9a4 4 0 014-4h14" }), + _createElementVNode("path", { d: "M3 19l-4-4 4-4" }), + _createElementVNode("path", { d: "M17 9v2a4 4 0 01-4 4H3" }) + ])) + : (_openBlock(), _createElementBlock("svg", { + key: 1, + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.8", + width: "14", + height: "14", + class: "spin" + }, [ + _createElementVNode("path", { d: "M10 2v4m0 8v4M2 10h4m8 0h4m-3.5-6.5l2.5 2.5M4 4l2.5 2.5M16 16l-2.5-2.5M4 16l2.5-2.5" }) + ])) + ], 8 /* PROPS */, ["onClick", "disabled"]) + ]), + (_ctx.skillsLoading && !_ctx.skillsMarketLocalLoadedOnce) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "skills-flow-loading" + }, _toDisplayString(_ctx.t('market.local.loading')), 1 /* TEXT */)) + : (_ctx.skillsList.length === 0) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "skills-flow-empty" + }, _toDisplayString(_ctx.t('market.local.empty')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 2, + class: "skills-flow-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.skillsList, (skill) => { + return (_openBlock(), _createElementBlock("div", { + key: 'skill-' + skill.name, + class: _normalizeClass(["skills-flow-item", { 'has-issue': !skill.hasSkillFile }]) + }, [ + _createElementVNode("div", { class: "skills-flow-main" }, [ + _createElementVNode("span", { class: "skills-flow-name" }, _toDisplayString(skill.displayName || skill.name), 1 /* TEXT */), + _createElementVNode("span", { class: "skills-flow-path" }, _toDisplayString(skill.path), 1 /* TEXT */) + ]), + _createElementVNode("span", { + class: _normalizeClass(['skills-flow-status', skill.hasSkillFile ? 'success' : 'warning']) + }, _toDisplayString(skill.hasSkillFile ? _ctx.t('market.pill.verified') : _ctx.t('market.pill.missingSkill')), 3 /* TEXT, CLASS */) + ], 2 /* CLASS */)) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ]), + _createCommentVNode(" Importable skills panel "), + _createElementVNode("div", { class: "skills-flow-panel" }, [ + _createElementVNode("div", { class: "skills-flow-header" }, [ + _createElementVNode("div", { class: "skills-flow-title-wrap" }, [ + _createElementVNode("span", { class: "skills-flow-title" }, _toDisplayString(_ctx.t('market.import.title')), 1 /* TEXT */), + _createElementVNode("span", { class: "skills-flow-count" }, _toDisplayString(_ctx.skillsImportList.length), 1 /* TEXT */) + ]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => (_ctx.scanImportableSkills({ silent: false })), + disabled: _ctx.loading || !!_ctx.initError || _ctx.skillsMarketBusy + }, [ + (!_ctx.skillsScanningImports) + ? (_openBlock(), _createElementBlock("svg", { + key: 0, + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.8", + width: "14", + height: "14" + }, [ + _createElementVNode("path", { d: "M17 1l4 4-4 4" }), + _createElementVNode("path", { d: "M3 11V9a4 4 0 014-4h14" }), + _createElementVNode("path", { d: "M3 19l-4-4 4-4" }), + _createElementVNode("path", { d: "M17 9v2a4 4 0 01-4 4H3" }) + ])) + : (_openBlock(), _createElementBlock("svg", { + key: 1, + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.8", + width: "14", + height: "14", + class: "spin" + }, [ + _createElementVNode("path", { d: "M10 2v4m0 8v4M2 10h4m8 0h4m-3.5-6.5l2.5 2.5M4 4l2.5 2.5M16 16l-2.5-2.5M4 16l2.5-2.5" }) + ])) + ], 8 /* PROPS */, ["onClick", "disabled"]) + ]), + (_ctx.skillsScanningImports && !_ctx.skillsMarketImportLoadedOnce) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "skills-flow-loading" + }, _toDisplayString(_ctx.t('market.import.loading')), 1 /* TEXT */)) + : (_ctx.skillsImportList.length === 0) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "skills-flow-empty" + }, _toDisplayString(_ctx.t('market.import.empty')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { key: 2 }, [ + _createCommentVNode(" Quick actions "), + _createElementVNode("div", { class: "skills-flow-actions" }, [ + _createElementVNode("button", { + type: "button", + class: "skills-action-btn", + onClick: _ctx.openSkillsManager, + disabled: _ctx.loading || !!_ctx.initError || _ctx.skillsMarketBusy + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.8", + width: "16", + height: "16" + }, [ + _createElementVNode("rect", { + x: "3", + y: "3", + width: "14", + height: "14", + rx: "3" + }), + _createElementVNode("path", { d: "M7 7h6M7 10h4" }) + ])), + _createTextVNode(" " + _toDisplayString(_ctx.t('market.action.manage.title')), 1 /* TEXT */) + ], 8 /* PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "skills-action-btn", + onClick: _ctx.triggerSkillsZipImport, + disabled: _ctx.loading || !!_ctx.initError || _ctx.skillsMarketBusy + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.8", + width: "16", + height: "16" + }, [ + _createElementVNode("path", { d: "M4 14l3-3 3 3" }), + _createElementVNode("path", { d: "M7 4v7" }), + _createElementVNode("rect", { + x: "12", + y: "4", + width: "5", + height: "12", + rx: "1" + }) + ])), + _createTextVNode(" " + _toDisplayString(_ctx.t('market.action.zipImport.title')), 1 /* TEXT */) + ], 8 /* PROPS */, ["onClick", "disabled"]) + ]), + _createCommentVNode(" Import list "), + _createElementVNode("div", { class: "skills-flow-list" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.skillsImportList, (skill) => { + return (_openBlock(), _createElementBlock("div", { + key: 'import-' + _ctx.buildSkillImportKey(skill), + class: "skills-flow-item" + }, [ + _createElementVNode("div", { class: "skills-flow-main" }, [ + _createElementVNode("span", { class: "skills-flow-name" }, _toDisplayString(skill.displayName || skill.name), 1 /* TEXT */), + _createElementVNode("span", { class: "skills-flow-meta" }, _toDisplayString(skill.sourceLabel), 1 /* TEXT */) + ]), + _createElementVNode("button", { + type: "button", + class: "skills-flow-add", + onClick: $event => (_ctx.importSingleSkill(skill)), + disabled: _ctx.loading || !!_ctx.initError || _ctx.skillsMarketBusy + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.8", + width: "16", + height: "16" + }, [ + _createElementVNode("path", { d: "M10 4v6m3-3l-3 3-3-3" }) + ])) + ], 8 /* PROPS */, ["onClick", "disabled"]) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ])) + ]) + ], 512 /* NEED_PATCH */), [ + [_vShow, _ctx.mainTab === 'market'] + ]), + _withDirectives(_createElementVNode("div", { + class: "mode-content", + id: "panel-plugins", + role: "tabpanel", + "aria-labelledby": "tab-plugins" + }, [ + _createElementVNode("div", { class: "plugins-layout" }, [ + _createElementVNode("aside", { + class: "plugins-sidebar", + "aria-label": _ctx.t('plugins.sidebar.ariaList') + }, [ + _createElementVNode("div", { class: "selector-header plugins-sidebar-header" }, [ + _createElementVNode("div", null, [ + _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('plugins.sidebar.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "plugins-panel-note" }, _toDisplayString(_ctx.t('plugins.sidebar.note')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "settings-tab-actions" }, [ + _createElementVNode("button", { + type: "button", + class: "btn-tool btn-tool-compact", + onClick: $event => (_ctx.loadPluginsOverview({ forceRefresh: true, silent: false })), + disabled: _ctx.loading || !!_ctx.initError || _ctx.pluginsLoading + }, _toDisplayString(_ctx.pluginsLoading ? _ctx.t('plugins.refreshing') : _ctx.t('plugins.refresh')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + _createElementVNode("div", { + class: "plugins-list", + role: "list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.pluginsCatalog, (plugin) => { + return (_openBlock(), _createElementBlock("button", { + key: 'plugin-' + plugin.id, + type: "button", + class: _normalizeClass(['plugins-item', { active: _ctx.pluginsActiveId === plugin.id }]), + "aria-current": _ctx.pluginsActiveId === plugin.id ? 'page' : null, + disabled: _ctx.loading || !!_ctx.initError || _ctx.pluginsLoading, + onClick: $event => (_ctx.selectPlugin(plugin.id)) + }, [ + _createElementVNode("div", { class: "plugins-item-main" }, [ + _createElementVNode("div", { class: "plugins-item-title" }, _toDisplayString(plugin.title), 1 /* TEXT */), + _createElementVNode("div", { class: "plugins-item-meta" }, _toDisplayString(plugin.description), 1 /* TEXT */) + ]), + _createElementVNode("span", { + class: _normalizeClass(['pill', plugin.tone]) + }, _toDisplayString(plugin.statusLabel), 3 /* TEXT, CLASS */) + ], 10 /* CLASS, PROPS */, ["aria-current", "disabled", "onClick"])) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ], 8 /* PROPS */, ["aria-label"]), + _createElementVNode("section", { + class: "plugins-main", + "aria-label": _ctx.t('plugins.main.ariaWorkspace') + }, [ + (_ctx.pluginsLoading) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "skills-empty-state" + }, _toDisplayString(_ctx.t('common.loading')), 1 /* TEXT */)) + : (_ctx.pluginsError) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "skills-empty-state" + }, [ + _createElementVNode("div", { class: "plugins-panel-note" }, _toDisplayString(_ctx.pluginsError), 1 /* TEXT */), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => (_ctx.loadPluginsOverview({ forceRefresh: true, silent: false })), + disabled: _ctx.loading || !!_ctx.initError || _ctx.pluginsLoading + }, _toDisplayString(_ctx.t('common.refresh')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ])) + : (_ctx.pluginsActiveId === 'prompt-templates') + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "plugins-panel" + }, [ + _createElementVNode("div", { class: "plugins-panel-head" }, [ + _createElementVNode("div", { class: "plugins-panel-title" }, _toDisplayString(_ctx.t('plugins.promptTemplates.title')), 1 /* TEXT */), + (_ctx.pluginsActiveAttribution) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "plugins-panel-note" + }, _toDisplayString(_ctx.pluginsActiveAttribution), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { + class: "prompt-templates-modebar", + role: "tablist", + "aria-label": _ctx.t('plugins.promptTemplates.mode.aria') + }, [ + _createElementVNode("button", { + type: "button", + role: "tab", + "aria-selected": _ctx.promptTemplatesMode === 'compose', + class: _normalizeClass(['mode-pill', { active: _ctx.promptTemplatesMode === 'compose' }]), + onClick: $event => {_ctx.promptTemplatesMode = 'compose'; if(typeof _ctx.saveNavState==='function')_ctx.saveNavState()} + }, [ + (_openBlock(), _createElementBlock("svg", { + style: {"width":"12px","height":"12px","vertical-align":"-1px","margin-right":"4px"}, + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round" + }, [ + _createElementVNode("path", { d: "M4 4h12v12H4z" }), + _createElementVNode("path", { d: "M8 8h4M8 11h2" }) + ])), + _createTextVNode(_toDisplayString(_ctx.t('plugins.promptTemplates.mode.compose')), 1 /* TEXT */) + ], 10 /* CLASS, PROPS */, ["aria-selected", "onClick"]), + _createElementVNode("button", { + type: "button", + role: "tab", + "aria-selected": _ctx.promptTemplatesMode !== 'compose', + class: _normalizeClass(['mode-pill', { active: _ctx.promptTemplatesMode !== 'compose' }]), + onClick: $event => {_ctx.promptTemplatesMode = 'manage'; if(typeof _ctx.saveNavState==='function')_ctx.saveNavState()} + }, [ + (_openBlock(), _createElementBlock("svg", { + style: {"width":"12px","height":"12px","vertical-align":"-1px","margin-right":"4px"}, + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round" + }, [ + _createElementVNode("path", { d: "M3 5h14M3 10h10M3 15h12" }) + ])), + _createTextVNode(_toDisplayString(_ctx.t('plugins.promptTemplates.mode.manage')), 1 /* TEXT */) + ], 10 /* CLASS, PROPS */, ["aria-selected", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]), + (_ctx.promptTemplatesMode === 'compose') + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "prompt-compose" + }, [ + _createElementVNode("div", { class: "prompt-compose-workspace" }, [ + _createElementVNode("div", { class: "prompt-compose-selected" }, [ + _createElementVNode("div", { class: "prompt-compose-selected-title" }, _toDisplayString((_ctx.promptComposerActiveTemplate && _ctx.promptComposerActiveTemplate.name) ? _ctx.promptComposerActiveTemplate.name : _ctx.t('plugins.promptTemplates.compose.chooseTemplate')), 1 /* TEXT */), + _createElementVNode("div", { class: "prompt-compose-selected-meta" }, _toDisplayString((_ctx.promptComposerActiveTemplate && _ctx.promptComposerActiveTemplate.description) ? _ctx.promptComposerActiveTemplate.description : _ctx.t('plugins.promptTemplates.compose.chooseTemplateHint')), 1 /* TEXT */), + (_ctx.promptComposerActiveTemplate && _ctx.promptComposerActiveTemplate.isBuiltin && (_ctx.promptComposerActiveTemplate.createdBy || (_ctx.promptComposerActiveTemplate.maintainers && _ctx.promptComposerActiveTemplate.maintainers.length))) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "plugins-panel-note" + }, _toDisplayString(_ctx.t('plugins.meta.attribution', { createdBy: _ctx.promptComposerActiveTemplate.createdBy || '', maintainers: (_ctx.promptComposerActiveTemplate.maintainers || []).join(', ') })), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "prompt-compose-form" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('plugins.promptTemplates.compose.selectTemplate')), 1 /* TEXT */), + _createElementVNode("select", { + class: "form-select prompt-compose-template-select", + value: _ctx.promptComposerSelectedTemplateId, + onChange: $event => (_ctx.selectPromptComposerTemplate($event.target.value)), + disabled: _ctx.pluginsLoading || !_ctx.promptTemplatesList.length + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.promptTemplatesList, (tpl) => { + return (_openBlock(), _createElementBlock("option", { + key: 'compose-tpl-' + tpl.id, + value: tpl.id + }, _toDisplayString(tpl.name) + _toDisplayString(tpl.isBuiltin ? _ctx.t('plugins.promptTemplates.compose.builtinSuffix') : ''), 9 /* TEXT, PROPS */, ["value"])) + }), 128 /* KEYED_FRAGMENT */)) + ], 40 /* PROPS, NEED_HYDRATION */, ["value", "onChange", "disabled"]), + (!_ctx.promptComposerActiveTemplate) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "plugins-panel-note" + }, _toDisplayString(_ctx.t('plugins.promptTemplates.compose.empty')), 1 /* TEXT */)) + : (!_ctx.promptComposerActiveTemplate.isBuiltin) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "plugins-panel-note" + }, _toDisplayString(_ctx.t('plugins.promptTemplates.compose.varsHint')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.promptComposerActiveTemplate && !_ctx.promptComposerActiveTemplate.isBuiltin) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "prompt-compose-actions" + }, [ + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: $event => (_ctx.selectPromptTemplate(_ctx.promptComposerSelectedTemplateId)), + disabled: _ctx.pluginsLoading || !_ctx.promptComposerSelectedTemplateId + }, _toDisplayString(_ctx.t('plugins.promptTemplates.compose.goManage')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ])) + : _createCommentVNode("v-if", true) + ]), + (_ctx.promptComposerActiveTemplate && _ctx.promptComposerActiveTemplate.vars && _ctx.promptComposerActiveTemplate.vars.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "prompt-vars-block" + }, [ + _createElementVNode("div", { class: "prompt-vars-head" }, [ + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "prompt-vars-title" }, _toDisplayString(_ctx.t('plugins.promptTemplates.vars.title')), 1 /* TEXT */), + (!_ctx.promptComposerActiveTemplate.isBuiltin) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "plugins-panel-note" + }, _toDisplayString(_ctx.t('plugins.promptTemplates.compose.varsHint')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.promptComposerMissingVars.length) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "plugins-panel-note" + }, _toDisplayString(_ctx.t('plugins.promptTemplates.compose.missingCount', { count: _ctx.promptComposerMissingVars.length })), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "prompt-editor-actions" }, [ + (_ctx.promptComposerMissingVars.length) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + type: "button", + class: "btn-mini", + onClick: _ctx.focusPromptComposerFirstMissingVar, + disabled: _ctx.pluginsLoading + }, _toDisplayString(_ctx.t('plugins.promptTemplates.compose.jumpToMissing')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])) + : _createCommentVNode("v-if", true), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: _ctx.resetPromptComposerVarValues, + disabled: _ctx.pluginsLoading + }, _toDisplayString(_ctx.t('plugins.promptTemplates.vars.reset')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + _createElementVNode("div", { class: "prompt-vars-grid" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.promptComposerActiveTemplate.vars, (name, idx) => { + return (_openBlock(), _createElementBlock("label", { + key: 'prompt-compose-var-' + name, + class: "prompt-var-row" + }, [ + _createElementVNode("span", { class: "prompt-var-label mono" }, _toDisplayString(name), 1 /* TEXT */), + (idx === 0) + ? (_openBlock(), _createElementBlock("input", { + key: 0, + ref_for: true, + ref: "promptComposerFirstField", + class: _normalizeClass(['form-input', 'prompt-var-input', { 'is-missing': _ctx.promptComposerMissingVars.includes(name) }]), + type: "text", + value: _ctx.promptComposerVarValues[name] || '', + onInput: $event => (_ctx.setPromptComposerVarValue(name, $event.target.value)), + placeholder: _ctx.t('plugins.promptTemplates.vars.valuePlaceholder', { name }) + }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, ["value", "onInput", "placeholder"])) + : (_openBlock(), _createElementBlock("input", { + key: 1, + class: _normalizeClass(['form-input', 'prompt-var-input', { 'is-missing': _ctx.promptComposerMissingVars.includes(name) }]), + type: "text", + value: _ctx.promptComposerVarValues[name] || '', + onInput: $event => (_ctx.setPromptComposerVarValue(name, $event.target.value)), + placeholder: _ctx.t('plugins.promptTemplates.vars.valuePlaceholder', { name }) + }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, ["value", "onInput", "placeholder"])) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ])) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "prompt-preview-block prompt-compose-preview" }, [ + _createElementVNode("div", { class: "prompt-vars-head" }, [ + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "prompt-vars-title" }, _toDisplayString(_ctx.t('plugins.promptTemplates.compose.outputTitle')), 1 /* TEXT */), + _createElementVNode("div", { class: "plugins-panel-note" }, _toDisplayString(_ctx.t('plugins.promptTemplates.compose.outputHint')), 1 /* TEXT */) + ]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: _ctx.copyPromptComposerRendered, + disabled: _ctx.pluginsLoading || !_ctx.promptComposerRendered + }, _toDisplayString(_ctx.t('plugins.promptTemplates.compose.copy')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]), + _createElementVNode("textarea", { + class: "form-input prompt-preview-textarea", + value: _ctx.promptComposerRendered, + rows: "10", + readonly: "", + spellcheck: "false", + "aria-label": _ctx.t('plugins.promptTemplates.compose.outputAria') + }, null, 8 /* PROPS */, ["value", "aria-label"]) + ]) + ]) + ])) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "prompt-templates-grid" + }, [ + _createElementVNode("div", { class: "prompt-templates-pane prompt-templates-pane-list" }, [ + _createElementVNode("div", { class: "prompt-templates-toolbar" }, [ + _withDirectives(_createElementVNode("input", { + class: "form-input", + type: "text", + "onUpdate:modelValue": $event => ((_ctx.promptTemplatesKeyword) = $event), + "aria-label": _ctx.t('plugins.promptTemplates.manage.searchAria'), + placeholder: _ctx.t('plugins.promptTemplates.manage.searchPlaceholder') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "aria-label", "placeholder"]), [ + [ + _vModelText, + _ctx.promptTemplatesKeyword, + void 0, + { trim: true } + ] + ]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: _ctx.createPromptTemplate, + disabled: _ctx.pluginsLoading + }, _toDisplayString(_ctx.t('plugins.promptTemplates.manage.create')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: _ctx.exportPromptTemplates, + disabled: _ctx.pluginsLoading || !_ctx.promptTemplatesList.length + }, _toDisplayString(_ctx.t('plugins.promptTemplates.manage.export')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: _ctx.triggerPromptTemplatesImport, + disabled: _ctx.pluginsLoading + }, _toDisplayString(_ctx.t('plugins.promptTemplates.manage.import')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]), + (_ctx.pluginsLoading && !_ctx.promptTemplatesLoadedOnce) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "skills-empty-state" + }, _toDisplayString(_ctx.t('plugins.promptTemplates.manage.loading')), 1 /* TEXT */)) + : (!_ctx.filteredPromptTemplates.length) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "skills-empty-state" + }, _toDisplayString(_ctx.t('plugins.promptTemplates.manage.empty')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 2, + class: "prompt-templates-list", + role: "list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.filteredPromptTemplates, (tpl) => { + return (_openBlock(), _createElementBlock("button", { + key: 'prompt-template-' + tpl.id, + type: "button", + class: _normalizeClass(['prompt-template-item', { active: _ctx.promptTemplateSelectedId === tpl.id }]), + "aria-current": _ctx.promptTemplateSelectedId === tpl.id ? 'page' : null, + onClick: $event => (_ctx.selectPromptTemplate(tpl.id)) + }, [ + _createElementVNode("div", { class: "prompt-template-item-main" }, [ + _createElementVNode("div", { class: "prompt-template-item-title" }, _toDisplayString(tpl.name), 1 /* TEXT */), + _createElementVNode("div", { class: "prompt-template-item-meta" }, [ + _createElementVNode("span", { class: "mono" }, _toDisplayString(_ctx.t('plugins.promptTemplates.manage.vars', { count: tpl.varCount })), 1 /* TEXT */), + _createElementVNode("span", null, "·"), + _createElementVNode("span", { class: "mono" }, _toDisplayString(tpl.updatedLabel), 1 /* TEXT */) + ]) + ]), + _createElementVNode("span", { + class: _normalizeClass(['pill', tpl.isBuiltin ? 'configured' : 'source']) + }, _toDisplayString(tpl.isBuiltin ? _ctx.t('plugins.promptTemplates.manage.builtin') : _ctx.t('plugins.promptTemplates.manage.custom')), 3 /* TEXT, CLASS */) + ], 10 /* CLASS, PROPS */, ["aria-current", "onClick"])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ]), + _createElementVNode("div", { class: "prompt-templates-pane prompt-templates-pane-editor" }, [ + (!_ctx.promptTemplateDraft) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "skills-empty-state" + }, _toDisplayString(_ctx.t('plugins.promptTemplates.editor.selectHint')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [ + _createElementVNode("div", { class: "prompt-editor-head" }, [ + _createElementVNode("div", { class: "prompt-editor-title-row" }, [ + _withDirectives(_createElementVNode("input", { + class: "form-input prompt-editor-name", + type: "text", + "onUpdate:modelValue": $event => ((_ctx.promptTemplateDraftRaw.name) = $event), + disabled: _ctx.promptTemplateDraft.isBuiltin, + placeholder: _ctx.t('plugins.promptTemplates.editor.namePlaceholder'), + "aria-label": _ctx.t('plugins.promptTemplates.editor.nameAria') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "disabled", "placeholder", "aria-label"]), [ + [ + _vModelText, + _ctx.promptTemplateDraftRaw.name, + void 0, + { trim: true } + ] + ]), + (!_ctx.promptTemplateDraft.isBuiltin) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "prompt-editor-actions" + }, [ + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: _ctx.duplicatePromptTemplate, + disabled: _ctx.pluginsLoading + }, _toDisplayString(_ctx.t('plugins.promptTemplates.editor.duplicate')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini delete", + onClick: _ctx.deletePromptTemplate, + disabled: _ctx.pluginsLoading + }, _toDisplayString(_ctx.t('plugins.promptTemplates.editor.delete')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: _ctx.savePromptTemplate, + disabled: _ctx.pluginsLoading + }, _toDisplayString(_ctx.t('plugins.promptTemplates.editor.save')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ])) + : _createCommentVNode("v-if", true) + ]), + (_ctx.promptTemplateDraft.isBuiltin) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "plugins-panel-note" + }, _toDisplayString(_ctx.t('plugins.promptTemplates.editor.builtinReadOnly')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.promptTemplateDraft.isBuiltin && (_ctx.promptTemplateDraft.createdBy || (_ctx.promptTemplateDraft.maintainers && _ctx.promptTemplateDraft.maintainers.length))) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "plugins-panel-note" + }, _toDisplayString(_ctx.t('plugins.meta.attribution', { createdBy: _ctx.promptTemplateDraft.createdBy || '', maintainers: (_ctx.promptTemplateDraft.maintainers || []).join(', ') })), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + _withDirectives(_createElementVNode("input", { + class: "form-input", + type: "text", + "onUpdate:modelValue": $event => ((_ctx.promptTemplateDraftRaw.description) = $event), + disabled: _ctx.promptTemplateDraft.isBuiltin, + placeholder: _ctx.t('plugins.promptTemplates.editor.descPlaceholder'), + "aria-label": _ctx.t('plugins.promptTemplates.editor.descAria') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "disabled", "placeholder", "aria-label"]), [ + [ + _vModelText, + _ctx.promptTemplateDraftRaw.description, + void 0, + { trim: true } + ] + ]) + ]), + _createElementVNode("div", { class: "prompt-editor-body" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('plugins.promptTemplates.editor.templateLabel')), 1 /* TEXT */), + _withDirectives(_createElementVNode("textarea", { + class: "form-input prompt-editor-textarea", + "onUpdate:modelValue": $event => ((_ctx.promptTemplateDraftRaw.template) = $event), + disabled: _ctx.promptTemplateDraft.isBuiltin, + rows: "10", + spellcheck: "false", + "aria-label": _ctx.t('plugins.promptTemplates.editor.templateAria'), + placeholder: _ctx.t('plugins.promptTemplates.editor.templatePlaceholder') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "disabled", "aria-label", "placeholder"]), [ + [_vModelText, _ctx.promptTemplateDraftRaw.template] + ]), + _createElementVNode("div", { class: "prompt-vars-block" }, [ + _createElementVNode("div", { class: "prompt-vars-head" }, [ + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "prompt-vars-title" }, _toDisplayString(_ctx.t('plugins.promptTemplates.vars.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "plugins-panel-note" }, _toDisplayString(_ctx.t('plugins.promptTemplates.vars.hint')), 1 /* TEXT */) + ]), + (!_ctx.promptTemplateDraft.isBuiltin) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "prompt-editor-actions" + }, [ + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: _ctx.resetPromptVariableValues, + disabled: _ctx.pluginsLoading + }, _toDisplayString(_ctx.t('plugins.promptTemplates.vars.reset')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ])) + : _createCommentVNode("v-if", true) + ]), + (!_ctx.promptTemplateVars.length) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "prompt-vars-empty" + }, _toDisplayString(_ctx.t('plugins.promptTemplates.vars.empty')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "prompt-vars-grid" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.promptTemplateVars, (name) => { + return (_openBlock(), _createElementBlock("label", { + key: 'prompt-var-' + name, + class: "prompt-var-row" + }, [ + _createElementVNode("span", { class: "prompt-var-label mono" }, _toDisplayString(name), 1 /* TEXT */), + _createElementVNode("input", { + class: "form-input prompt-var-input", + type: "text", + readonly: _ctx.promptTemplateDraft.isBuiltin, + value: _ctx.promptTemplateVarValues[name] || '', + onInput: $event => (_ctx.setPromptVariableValue(name, $event.target.value)), + placeholder: _ctx.t('plugins.promptTemplates.vars.valuePlaceholder', { name }) + }, null, 40 /* PROPS, NEED_HYDRATION */, ["readonly", "value", "onInput", "placeholder"]) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ]), + _createElementVNode("div", { class: "prompt-preview-block" }, [ + _createElementVNode("div", { class: "prompt-vars-head" }, [ + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "prompt-vars-title" }, _toDisplayString(_ctx.t('plugins.promptTemplates.preview.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "plugins-panel-note" }, _toDisplayString(_ctx.t('plugins.promptTemplates.preview.hint')), 1 /* TEXT */) + ]), + _createElementVNode("button", { + type: "button", + class: "btn-mini", + onClick: _ctx.copyRenderedPrompt, + disabled: _ctx.pluginsLoading + }, _toDisplayString(_ctx.t('plugins.promptTemplates.preview.copy')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]), + _createElementVNode("textarea", { + class: "form-input prompt-preview-textarea", + value: _ctx.renderedPrompt, + rows: "10", + readonly: "", + spellcheck: "false", + "aria-label": _ctx.t('plugins.promptTemplates.preview.outputAria') + }, null, 8 /* PROPS */, ["value", "aria-label"]) + ]) + ]) + ], 64 /* STABLE_FRAGMENT */)) + ]) + ])) + ])) + : (_openBlock(), _createElementBlock("div", { + key: 3, + class: "skills-empty-state" + }, _toDisplayString(_ctx.t('plugins.promptTemplates.noPluginSelected')), 1 /* TEXT */)) + ], 8 /* PROPS */, ["aria-label"]) + ]) + ], 512 /* NEED_PATCH */), [ + [_vShow, _ctx.mainTab === 'plugins'] + ]), + _createElementVNode("input", { + ref: "promptTemplatesImportInput", + type: "file", + accept: ".json,application/json", + style: {"display":"none"}, + onChange: _ctx.handlePromptTemplatesImportChange + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onChange"]), + _createCommentVNode(" 加载状态 "), + (_ctx.loading) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "state-message" + }, _toDisplayString(_ctx.t('app.loadingConfig')), 1 /* TEXT */)) + : (_ctx.initError) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "state-message error" + }, [ + _createCommentVNode(" 错误状态 "), + _createTextVNode(" " + _toDisplayString(_ctx.initError), 1 /* TEXT */) + ])) + : _createCommentVNode("v-if", true) + ]) + ]) + ], 2 /* CLASS */), + _createCommentVNode(" 添加提供商模态框 "), + (_ctx.showAddModal) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "modal-overlay", + onClick: _withModifiers(_ctx.closeAddModal, ["self"]) + }, [ + _createElementVNode("div", { + class: "modal", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "add-provider-modal-title" + }, [ + _createElementVNode("div", { + class: "modal-title", + id: "add-provider-modal-title" + }, _toDisplayString(_ctx.t('modal.providerAdd.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.name')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.newProvider.name) = $event), + class: _normalizeClass(['form-input', { invalid: !!_ctx.providerFieldError('add', 'name') }]), + placeholder: _ctx.t('placeholder.providerNameExample'), + autocomplete: "off", + spellcheck: "false", + onBlur: $event => (_ctx.normalizeProviderDraft('add')) + }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onBlur"]), [ + [_vModelText, _ctx.newProvider.name] + ]), + (_ctx.providerFieldError('add', 'name')) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "form-hint form-error" + }, _toDisplayString(_ctx.providerFieldError('add', 'name')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.apiEndpoint')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.newProvider.url) = $event), + class: _normalizeClass(['form-input', { invalid: !!_ctx.providerFieldError('add', 'url') }]), + placeholder: _ctx.t('placeholder.apiEndpointExample'), + autocomplete: "off", + spellcheck: "false", + onBlur: $event => (_ctx.normalizeProviderDraft('add')) + }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onBlur"]), [ + [_vModelText, _ctx.newProvider.url] + ]), + (_ctx.providerFieldError('add', 'url')) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "form-hint form-error" + }, _toDisplayString(_ctx.providerFieldError('add', 'url')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.apiKey')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.newProvider.key) = $event), + class: "form-input", + type: "password", + placeholder: "sk-..." + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.newProvider.key] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, [ + _withDirectives(_createElementVNode("input", { + type: "checkbox", + "onUpdate:modelValue": $event => ((_ctx.newProvider.useTransform) = $event) + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelCheckbox, _ctx.newProvider.useTransform] + ]), + _createTextVNode(" " + _toDisplayString(_ctx.t('field.useBuiltinTransform')), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-cancel", + onClick: _ctx.closeAddModal + }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick"]), + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.addProvider, + disabled: !_ctx.canSubmitProvider('add') + }, _toDisplayString(_ctx.t('common.add')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + _createCommentVNode(" 编辑提供商模态框 "), + (_ctx.showEditModal) + ? (_openBlock(), _createElementBlock("div", { + key: 3, + class: "modal-overlay", + onClick: _withModifiers(_ctx.closeEditModal, ["self"]) + }, [ + _createElementVNode("div", { + class: "modal", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "edit-provider-modal-title" + }, [ + _createElementVNode("div", { + class: "modal-title", + id: "edit-provider-modal-title" + }, _toDisplayString(_ctx.t('modal.providerEdit.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.name')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.editingProvider.name) = $event), + class: "form-input", + placeholder: _ctx.t('placeholder.providerName'), + readonly: "" + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.editingProvider.name] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.apiEndpoint')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.editingProvider.url) = $event), + class: _normalizeClass(['form-input', { invalid: !!_ctx.providerFieldError('edit', 'url') }]), + placeholder: _ctx.t('placeholder.apiEndpointExample'), + autocomplete: "off", + spellcheck: "false", + onBlur: $event => (_ctx.normalizeProviderDraft('edit')) + }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onBlur"]), [ + [_vModelText, _ctx.editingProvider.url] + ]), + (_ctx.providerFieldError('edit', 'url')) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "form-hint form-error" + }, _toDisplayString(_ctx.providerFieldError('edit', 'url')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.apiKey')), 1 /* TEXT */), + _createElementVNode("div", { class: "input-with-toggle" }, [ + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.editingProvider.key) = $event), + class: "form-input", + type: _ctx.showEditProviderKey ? 'text' : 'password', + placeholder: "sk-...", + autocomplete: "off", + spellcheck: "false" + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "type"]), [ + [_vModelDynamic, _ctx.editingProvider.key] + ]), + _createElementVNode("button", { + type: "button", + class: "input-toggle-btn", + onClick: _ctx.toggleEditProviderKey, + title: _ctx.showEditProviderKey ? _ctx.t('common.hide') : _ctx.t('common.show') + }, [ + (!_ctx.showEditProviderKey) + ? (_openBlock(), _createElementBlock("svg", { + key: 0, + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.5", + width: "16", + height: "16" + }, [ + _createElementVNode("path", { d: "M10 4C5 4 1.73 8.11 1 10c.73 1.89 4 6 9 6s8.27-4.11 9-6c-.73-1.89-4-6-9-6z" }), + _createElementVNode("circle", { + cx: "10", + cy: "10", + r: "3" + }) + ])) + : (_openBlock(), _createElementBlock("svg", { + key: 1, + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.5", + width: "16", + height: "16" + }, [ + _createElementVNode("path", { d: "M2 2l16 16M8.2 4.2A9.9 9.9 0 0 1 10 4c5 0 8.27 4.11 9 6-.44.94-1.5 2.7-3.2 4.2M14.5 14.5A5.9 5.9 0 0 1 10 16c-5 0-8.27-4.11-9-6 .76-1.66 2.2-3.6 4.3-5" }) + ])) + ], 8 /* PROPS */, ["onClick", "title"]) + ]) + ]), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-cancel", + onClick: _ctx.closeEditModal + }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick"]), + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.updateProvider, + disabled: !_ctx.canSubmitProvider('edit') + }, _toDisplayString(_ctx.t('common.save')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + _createCommentVNode(" 添加模型模态框 "), + (_ctx.showModelModal) + ? (_openBlock(), _createElementBlock("div", { + key: 4, + class: "modal-overlay", + onClick: _withModifiers(_ctx.closeModelModal, ["self"]) + }, [ + _createElementVNode("div", { + class: "modal", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "add-model-modal-title" + }, [ + _createElementVNode("div", { + class: "modal-title", + id: "add-model-modal-title" + }, _toDisplayString(_ctx.t('modal.modelAdd.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.modelName')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.newModelName) = $event), + class: "form-input", + placeholder: _ctx.t('placeholder.modelExample') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.newModelName] + ]) + ]), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-cancel", + onClick: _ctx.closeModelModal + }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick"]), + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.addModel + }, _toDisplayString(_ctx.t('common.add')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + _createCommentVNode(" 模型列表模态框 "), + (_ctx.showModelListModal) + ? (_openBlock(), _createElementBlock("div", { + key: 5, + class: "modal-overlay", + onClick: _withModifiers($event => (_ctx.showModelListModal = false), ["self"]) + }, [ + _createElementVNode("div", { + class: "modal", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "manage-models-modal-title" + }, [ + _createElementVNode("div", { + class: "modal-title", + id: "manage-models-modal-title" + }, _toDisplayString(_ctx.t('modal.modelManage.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "model-list" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.models, (model) => { + return (_openBlock(), _createElementBlock("div", { + key: model, + class: "model-item" + }, [ + _createElementVNode("span", null, _toDisplayString(model), 1 /* TEXT */), + _createElementVNode("button", { + type: "button", + class: "btn-remove-model", + onClick: $event => (_ctx.removeModel(model)) + }, _toDisplayString(_ctx.t('common.delete')), 9 /* TEXT, PROPS */, ["onClick"]) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ]), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: $event => (_ctx.showModelListModal = false) + }, _toDisplayString(_ctx.t('common.close')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + _createCommentVNode(" 添加Claude配置模态框 "), + (_ctx.showClaudeConfigModal) + ? (_openBlock(), _createElementBlock("div", { + key: 6, + class: "modal-overlay", + onClick: _withModifiers(_ctx.closeClaudeConfigModal, ["self"]) + }, [ + _createElementVNode("div", { + class: "modal", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "add-claude-config-modal-title" + }, [ + _createElementVNode("div", { + class: "modal-title", + id: "add-claude-config-modal-title" + }, _toDisplayString(_ctx.t('modal.claudeConfigAdd.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.configName')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.newClaudeConfig.name) = $event), + class: "form-input", + placeholder: _ctx.t('placeholder.configNameExample') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.newClaudeConfig.name] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "API Key"), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.newClaudeConfig.apiKey) = $event), + class: "form-input", + type: "password", + autocomplete: "off", + spellcheck: "false", + placeholder: _ctx.t('placeholder.apiKeyExampleClaude') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.newClaudeConfig.apiKey] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.baseUrl')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.newClaudeConfig.baseUrl) = $event), + class: "form-input", + placeholder: _ctx.t('placeholder.baseUrlExampleClaude') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.newClaudeConfig.baseUrl] + ]) + ]), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-cancel", + onClick: _ctx.closeClaudeConfigModal + }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick"]), + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.addClaudeConfig + }, _toDisplayString(_ctx.t('common.add')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + _createCommentVNode(" 编辑Claude配置模态框 "), + (_ctx.showEditConfigModal) + ? (_openBlock(), _createElementBlock("div", { + key: 7, + class: "modal-overlay", + onClick: _withModifiers(_ctx.closeEditConfigModal, ["self"]) + }, [ + _createElementVNode("div", { + class: "modal", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "edit-claude-config-modal-title" + }, [ + _createElementVNode("div", { + class: "modal-title", + id: "edit-claude-config-modal-title" + }, _toDisplayString(_ctx.t('modal.claudeConfigEdit.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.configName')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.editingConfig.name) = $event), + class: "form-input", + placeholder: _ctx.t('field.configName'), + readonly: "" + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.editingConfig.name] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "API Key"), + _createElementVNode("div", { class: "input-with-toggle" }, [ + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.editingConfig.apiKey) = $event), + class: "form-input", + type: _ctx.showEditClaudeConfigKey ? 'text' : 'password', + autocomplete: "off", + spellcheck: "false", + placeholder: _ctx.t('placeholder.apiKeyExampleClaude') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "type", "placeholder"]), [ + [_vModelDynamic, _ctx.editingConfig.apiKey] + ]), + _createElementVNode("button", { + type: "button", + class: "input-toggle-btn", + onClick: _ctx.toggleEditClaudeConfigKey, + title: _ctx.showEditClaudeConfigKey ? _ctx.t('common.hide') : _ctx.t('common.show') + }, [ + (!_ctx.showEditClaudeConfigKey) + ? (_openBlock(), _createElementBlock("svg", { + key: 0, + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.5", + width: "16", + height: "16" + }, [ + _createElementVNode("path", { d: "M10 4C5 4 1.73 8.11 1 10c.73 1.89 4 6 9 6s8.27-4.11 9-6c-.73-1.89-4-6-9-6z" }), + _createElementVNode("circle", { + cx: "10", + cy: "10", + r: "3" + }) + ])) + : (_openBlock(), _createElementBlock("svg", { + key: 1, + viewBox: "0 0 20 20", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.5", + width: "16", + height: "16" + }, [ + _createElementVNode("path", { d: "M2 2l16 16M8.2 4.2A9.9 9.9 0 0 1 10 4c5 0 8.27 4.11 9 6-.44.94-1.5 2.7-3.2 4.2M14.5 14.5A5.9 5.9 0 0 1 10 16c-5 0-8.27-4.11-9-6 .76-1.66 2.2-3.6 4.3-5" }) + ])) + ], 8 /* PROPS */, ["onClick", "title"]) + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.baseUrl')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.editingConfig.baseUrl) = $event), + class: "form-input", + placeholder: _ctx.t('placeholder.baseUrlExampleClaude') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.editingConfig.baseUrl] + ]) + ]), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-cancel", + onClick: _ctx.closeEditConfigModal + }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick"]), + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.saveAndApplyConfig + }, _toDisplayString(_ctx.t('common.saveApply')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + _createCommentVNode(" Codex 轮询池控制模态框 "), + (_ctx.showCodexBridgePoolModal) + ? (_openBlock(), _createElementBlock("div", { + key: 8, + class: "modal-overlay", + onClick: _withModifiers($event => (_ctx.showCodexBridgePoolModal = false), ["self"]) + }, [ + _createElementVNode("div", { + class: "modal modal-bridge-pool", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "codex-bridge-pool-modal-title" + }, [ + _createElementVNode("div", { + class: "modal-title", + id: "codex-bridge-pool-modal-title" + }, [ + (_openBlock(), _createElementBlock("svg", { + class: "modal-title-icon", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + width: "18", + height: "18" + }, [ + _createElementVNode("circle", { + cx: "6", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "18", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "12", + cy: "18", + r: "2" + }), + _createElementVNode("path", { d: "M6 8v4h6v4" }), + _createElementVNode("path", { d: "M18 8v4h-6v4" }) + ])), + _createTextVNode(" 轮询池设置 ") + ]), + _createElementVNode("div", { class: "bridge-pool-modal-hint" }, "勾选参与负载均衡的提供商"), + (_ctx.localBridgeCandidateProviders().length === 0) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "bridge-pool-empty" + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.5", + width: "16", + height: "16" + }, [ + _createElementVNode("path", { d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0z" }) + ])), + _createElementVNode("span", null, "暂无可用上游 provider,请先添加直连 provider") + ])) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "bridge-pool-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.localBridgeCandidateProviders(), (cp) => { + return (_openBlock(), _createElementBlock("label", { + key: cp.name, + class: "bridge-pool-item" + }, [ + _createElementVNode("span", { class: "bridge-pool-item-name" }, _toDisplayString(cp.name), 1 /* TEXT */), + _createElementVNode("span", { + class: _normalizeClass(["bridge-pool-item-status", { active: !_ctx.isLocalBridgeExcluded(cp.name) }]) + }, _toDisplayString(_ctx.isLocalBridgeExcluded(cp.name) ? '未启用' : '已启用'), 3 /* TEXT, CLASS */), + _createElementVNode("input", { + type: "checkbox", + checked: !_ctx.isLocalBridgeExcluded(cp.name), + onChange: $event => (_ctx.toggleLocalBridgeExcluded(cp.name)) + }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ])), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: $event => (_ctx.showCodexBridgePoolModal = false) + }, _toDisplayString(_ctx.t('common.close')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + (_ctx.showClaudeBridgePoolModal) + ? (_openBlock(), _createElementBlock("div", { + key: 9, + class: "modal-overlay", + onClick: _withModifiers($event => (_ctx.showClaudeBridgePoolModal = false), ["self"]) + }, [ + _createElementVNode("div", { + class: "modal modal-bridge-pool", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "claude-bridge-pool-modal-title" + }, [ + _createElementVNode("div", { + class: "modal-title", + id: "claude-bridge-pool-modal-title" + }, [ + (_openBlock(), _createElementBlock("svg", { + class: "modal-title-icon", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + width: "18", + height: "18" + }, [ + _createElementVNode("circle", { + cx: "6", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "18", + cy: "6", + r: "2" + }), + _createElementVNode("circle", { + cx: "12", + cy: "18", + r: "2" + }), + _createElementVNode("path", { d: "M6 8v4h6v4" }), + _createElementVNode("path", { d: "M18 8v4h-6v4" }) + ])), + _createTextVNode(" " + _toDisplayString(_ctx.t('claude.localBridge.poolTitle')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "bridge-pool-modal-hint" }, _toDisplayString(_ctx.t('claude.localBridge.poolHint')), 1 /* TEXT */), + (_ctx.claudeLocalBridgeCandidateProviders().length === 0) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "bridge-pool-empty" + }, [ + (_openBlock(), _createElementBlock("svg", { + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "1.5", + width: "16", + height: "16" + }, [ + _createElementVNode("path", { d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0z" }) + ])), + _createElementVNode("span", null, _toDisplayString(_ctx.t('claude.localBridge.noProviders')), 1 /* TEXT */) + ])) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "bridge-pool-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.claudeLocalBridgeCandidateProviders(), (cp) => { + return (_openBlock(), _createElementBlock("label", { + key: cp.name, + class: "bridge-pool-item" + }, [ + _createElementVNode("span", { class: "bridge-pool-item-name" }, _toDisplayString(cp.name), 1 /* TEXT */), + _createElementVNode("span", { + class: _normalizeClass(["bridge-pool-item-status", { active: !_ctx.isClaudeLocalBridgeExcluded(cp.name) }]) + }, _toDisplayString(_ctx.isClaudeLocalBridgeExcluded(cp.name) ? _ctx.t('claude.localBridge.disabled') : _ctx.t('claude.localBridge.enabled')), 3 /* TEXT, CLASS */), + _createElementVNode("input", { + type: "checkbox", + checked: !_ctx.isClaudeLocalBridgeExcluded(cp.name), + onChange: $event => (_ctx.toggleClaudeLocalBridgeExcluded(cp.name)) + }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ])), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: $event => (_ctx.showClaudeBridgePoolModal = false) + }, _toDisplayString(_ctx.t('common.close')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + _createCommentVNode(" Webhook 配置模态框 "), + (_ctx.showWebhookModal) + ? (_openBlock(), _createElementBlock("div", { + key: 10, + class: "modal-overlay", + onClick: _withModifiers(_ctx.closeWebhookModal, ["self"]) + }, [ + _createElementVNode("div", { + class: "modal", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "webhook-modal-title" + }, [ + _createElementVNode("div", { + class: "modal-title", + id: "webhook-modal-title" + }, "Webhook 配置"), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "启用状态"), + _createElementVNode("label", { class: "settings-toggle" }, [ + _withDirectives(_createElementVNode("input", { + type: "checkbox", + "onUpdate:modelValue": $event => ((_ctx.webhookConfig.enabled) = $event) + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelCheckbox, _ctx.webhookConfig.enabled] + ]), + _createElementVNode("span", null, "启用 Webhook") + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "URL"), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.webhookConfig.url) = $event), + class: "form-input", + type: "url", + placeholder: "https://example.com/webhook", + autocomplete: "off", + spellcheck: "false" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.webhookConfig.url] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "事件"), + _createElementVNode("div", { class: "webhook-events-checkbox-list" }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.webhookEventOptions, (ev) => { + return (_openBlock(), _createElementBlock("label", { + key: ev, + class: "webhook-event-checkbox-item" + }, [ + _createElementVNode("input", { + type: "checkbox", + checked: _ctx.webhookConfig.events.includes(ev), + onChange: $event => (_ctx.toggleWebhookEvent(ev)) + }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]), + _createElementVNode("span", null, _toDisplayString(ev), 1 /* TEXT */) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ]) + ]), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-cancel", + onClick: _ctx.closeWebhookModal + }, "取消", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.saveWebhookSettings, + disabled: _ctx.webhookSaving + }, _toDisplayString(_ctx.webhookSaving ? '保存中...' : '保存'), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + (_ctx.showOpenclawConfigModal) + ? (_openBlock(), _createElementBlock("div", { + key: 11, + class: "modal-overlay", + onClick: _withModifiers($event => (!(_ctx.openclawSaving || _ctx.openclawApplying) && _ctx.closeOpenclawConfigModal()), ["self"]) + }, [ + _createElementVNode("div", { + class: "modal modal-wide", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "openclaw-config-modal-title" + }, [ + _createElementVNode("div", { + class: "modal-title", + id: "openclaw-config-modal-title" + }, _toDisplayString(_ctx.openclawEditorTitle), 1 /* TEXT */), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.configName')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawEditing.name) = $event), + class: "form-input", + readonly: _ctx.openclawEditing.lockName, + placeholder: _ctx.t('placeholder.openclawConfigNameExample') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "readonly", "placeholder"]), [ + [_vModelText, _ctx.openclawEditing.name] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.targetFile')), 1 /* TEXT */), + _createElementVNode("div", { class: "form-hint" }, [ + _createTextVNode(_toDisplayString(_ctx.openclawConfigPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */), + (_ctx.openclawConfigPath) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, " (" + _toDisplayString(_ctx.openclawConfigExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnApply')) + ") ", 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { + class: "btn-group", + style: {"justify-content":"flex-start"} + }, [ + _createElementVNode("button", { + class: "btn btn-confirm secondary", + onClick: _ctx.loadOpenclawConfigFromFile, + disabled: _ctx.openclawFileLoading + }, _toDisplayString(_ctx.openclawFileLoading ? _ctx.t('common.loading') : _ctx.t('modal.openclaw.loadCurrent')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + _createElementVNode("div", { class: "quick-section" }, [ + _createElementVNode("div", { class: "quick-header" }, [ + _createElementVNode("div", null, [ + _createElementVNode("div", { class: "quick-title" }, _toDisplayString(_ctx.t('modal.openclaw.quick.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('modal.openclaw.quick.subtitle')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "quick-actions" }, [ + _createElementVNode("button", { + class: "btn-mini", + onClick: _ctx.syncOpenclawQuickFromText + }, _toDisplayString(_ctx.t('modal.openclaw.quick.readFromEditor')), 9 /* TEXT, PROPS */, ["onClick"]), + _createElementVNode("button", { + class: "btn-mini", + onClick: _ctx.resetOpenclawQuick + }, _toDisplayString(_ctx.t('common.clear')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ]), + _createElementVNode("div", { class: "quick-steps" }, [ + _createElementVNode("div", { class: "quick-step" }, [ + _createElementVNode("span", { class: "step-badge" }, "1"), + _createElementVNode("span", null, _toDisplayString(_ctx.t('modal.openclaw.quick.step1')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "quick-step" }, [ + _createElementVNode("span", { class: "step-badge" }, "2"), + _createElementVNode("span", null, _toDisplayString(_ctx.t('modal.openclaw.quick.step2')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "quick-step" }, [ + _createElementVNode("span", { class: "step-badge" }, "3"), + _createElementVNode("span", null, _toDisplayString(_ctx.t('modal.openclaw.quick.step3')), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "quick-grid" }, [ + _createElementVNode("div", { class: "quick-card" }, [ + _createElementVNode("div", { class: "structured-card-title" }, "Provider"), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.providerName')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawQuick.providerName) = $event), + class: "form-input", + placeholder: "例如: custom-myapi" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.openclawQuick.providerName] + ]), + _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('modal.openclaw.quick.providerHint')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.baseUrl')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawQuick.baseUrl) = $event), + class: "form-input", + placeholder: "https://api.example.com/v1", + readonly: _ctx.openclawQuick.baseUrlReadOnly + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "readonly"]), [ + [_vModelText, _ctx.openclawQuick.baseUrl] + ]), + (_ctx.openclawQuick.baseUrlDisplayKind === 'builtin-default') + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "form-hint" + }, _toDisplayString(_ctx.t('modal.openclaw.quick.baseUrlHintDefault')), 1 /* TEXT */)) + : (_ctx.openclawQuick.baseUrlReadOnly) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "form-hint" + }, _toDisplayString(_ctx.t('modal.openclaw.quick.baseUrlHintReadonly')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "API Key"), + _createElementVNode("div", { class: "list-row" }, [ + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawQuick.apiKey) = $event), + class: "form-input", + readonly: _ctx.openclawQuick.apiKeyReadOnly, + type: (_ctx.openclawQuick.apiKeyReadOnly || _ctx.openclawQuick.showKey) ? 'text' : 'password', + placeholder: "sk-..." + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "readonly", "type"]), [ + [_vModelDynamic, _ctx.openclawQuick.apiKey] + ]), + (!_ctx.openclawQuick.apiKeyReadOnly) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + class: "btn-mini", + onClick: _ctx.toggleOpenclawQuickKey + }, _toDisplayString(_ctx.openclawQuick.showKey ? _ctx.t('common.hide') : _ctx.t('common.show')), 9 /* TEXT, PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true) + ]), + (_ctx.openclawQuick.apiKeyDisplayKind === 'auth-profile-value') + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "form-hint" + }, _toDisplayString(_ctx.t('modal.openclaw.quick.apiKeyHintFromAuth')), 1 /* TEXT */)) + : (_ctx.openclawQuick.apiKeyReadOnly) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "form-hint" + }, _toDisplayString(_ctx.t('modal.openclaw.quick.apiKeyHintReadonly')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 2, + class: "form-hint" + }, _toDisplayString(_ctx.t('modal.openclaw.quick.apiKeyHintKeep')), 1 /* TEXT */)) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.apiType')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawQuick.apiType) = $event), + class: "form-input", + list: "openclawApiTypeList", + placeholder: _ctx.t('placeholder.apiTypeExample') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.openclawQuick.apiType] + ]), + _createElementVNode("datalist", { id: "openclawApiTypeList" }, [ + _createElementVNode("option", { value: "openai-responses" }), + _createElementVNode("option", { value: "openai-chat" }), + _createElementVNode("option", { value: "anthropic" }), + _createElementVNode("option", { value: "custom" }) + ]) + ]) + ]), + _createElementVNode("div", { class: "quick-card" }, [ + _createElementVNode("div", { class: "structured-card-title" }, _toDisplayString(_ctx.t('modal.openclaw.quick.modelTitle')), 1 /* TEXT */), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.modelId')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawQuick.modelId) = $event), + class: "form-input", + placeholder: _ctx.t('placeholder.modelIdExample') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.openclawQuick.modelId] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.displayName')), 1 /* TEXT */), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawQuick.modelName) = $event), + class: "form-input", + placeholder: _ctx.t('placeholder.modelNameOptional') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.openclawQuick.modelName] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('field.contextAndMaxOutput')), 1 /* TEXT */), + _createElementVNode("div", { class: "list-row" }, [ + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawQuick.contextWindow) = $event), + class: "form-input", + placeholder: _ctx.t('field.contextWindow') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.openclawQuick.contextWindow] + ]), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawQuick.maxTokens) = $event), + class: "form-input", + placeholder: _ctx.t('field.maxOutput') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [ + [_vModelText, _ctx.openclawQuick.maxTokens] + ]) + ]), + _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('hint.emptyNoChange')), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "quick-card" }, [ + _createElementVNode("div", { class: "structured-card-title" }, _toDisplayString(_ctx.t('modal.openclaw.quick.optionsTitle')), 1 /* TEXT */), + _createElementVNode("label", { class: "quick-option" }, [ + _withDirectives(_createElementVNode("input", { + type: "checkbox", + "onUpdate:modelValue": $event => ((_ctx.openclawQuick.setPrimary) = $event) + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelCheckbox, _ctx.openclawQuick.setPrimary] + ]), + _createTextVNode(" " + _toDisplayString(_ctx.t('modal.openclaw.quick.setPrimary')), 1 /* TEXT */) + ]), + _createElementVNode("label", { class: "quick-option" }, [ + _withDirectives(_createElementVNode("input", { + type: "checkbox", + "onUpdate:modelValue": $event => ((_ctx.openclawQuick.overrideProvider) = $event) + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelCheckbox, _ctx.openclawQuick.overrideProvider] + ]), + _createTextVNode(" " + _toDisplayString(_ctx.t('modal.openclaw.quick.overrideProvider')), 1 /* TEXT */) + ]), + _createElementVNode("label", { class: "quick-option" }, [ + _withDirectives(_createElementVNode("input", { + type: "checkbox", + "onUpdate:modelValue": $event => ((_ctx.openclawQuick.overrideModels) = $event) + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelCheckbox, _ctx.openclawQuick.overrideModels] + ]), + _createTextVNode(" " + _toDisplayString(_ctx.t('modal.openclaw.quick.overrideModels')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('modal.openclaw.quick.optionsHint')), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.applyOpenclawQuickToText + }, _toDisplayString(_ctx.t('modal.openclaw.quick.writeToEditor')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ]), + _createElementVNode("div", { class: "structured-section" }, [ + _createElementVNode("div", { class: "structured-header" }, [ + _createElementVNode("span", { class: "structured-title" }, "结构化配置(高级)"), + _createElementVNode("span", { class: "form-hint" }, _toDisplayString(_ctx.t('modal.openclaw.structured.writeHint')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "structured-grid" }, [ + _createElementVNode("div", { class: "structured-card" }, [ + _createElementVNode("div", { class: "structured-card-title" }, "Agents Defaults"), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "主模型"), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawStructured.agentPrimary) = $event), + class: "form-input", + placeholder: "例如: provider/model" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.openclawStructured.agentPrimary] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "备选模型"), + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.openclawStructured.agentFallbacks, (item, index) => { + return (_openBlock(), _createElementBlock("div", { + class: "list-row", + key: 'fallback-' + index + }, [ + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawStructured.agentFallbacks[index]) = $event), + class: "form-input", + placeholder: "例如: provider/model" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.openclawStructured.agentFallbacks[index]] + ]), + _createElementVNode("button", { + class: "btn-mini delete", + onClick: $event => (_ctx.removeOpenclawFallback(index)) + }, "删除", 8 /* PROPS */, ["onClick"]) + ])) + }), 128 /* KEYED_FRAGMENT */)), + _createElementVNode("button", { + class: "btn-mini", + onClick: _ctx.addOpenclawFallback + }, "添加备选", 8 /* PROPS */, ["onClick"]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "Workspace"), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawStructured.workspace) = $event), + class: "form-input", + placeholder: "例如: ~/.openclaw/workspace" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.openclawStructured.workspace] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "Timeout(s)"), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawStructured.timeout) = $event), + class: "form-input", + placeholder: "例如: 600" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.openclawStructured.timeout] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "Context Tokens"), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawStructured.contextTokens) = $event), + class: "form-input", + placeholder: "例如: 4096" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.openclawStructured.contextTokens] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "Max Concurrent"), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawStructured.maxConcurrent) = $event), + class: "form-input", + placeholder: "例如: 2" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.openclawStructured.maxConcurrent] + ]) + ]) + ]), + _createElementVNode("div", { class: "structured-card" }, [ + _createElementVNode("div", { class: "structured-card-title" }, "Env"), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "环境变量"), + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.openclawStructured.envItems, (item, index) => { + return (_openBlock(), _createElementBlock("div", { + class: "list-row", + key: 'env-' + index + }, [ + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((item.key) = $event), + class: "form-input", + placeholder: "KEY" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, item.key] + ]), + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((item.value) = $event), + class: "form-input", + type: item.show ? 'text' : 'password', + placeholder: "VALUE" + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "type"]), [ + [_vModelDynamic, item.value] + ]), + _createElementVNode("button", { + class: "btn-mini", + onClick: $event => (_ctx.toggleOpenclawEnvItem(index)) + }, _toDisplayString(item.show ? '隐藏' : '显示'), 9 /* TEXT, PROPS */, ["onClick"]), + _createElementVNode("button", { + class: "btn-mini delete", + onClick: $event => (_ctx.removeOpenclawEnvItem(index)) + }, "删除", 8 /* PROPS */, ["onClick"]) + ])) + }), 128 /* KEYED_FRAGMENT */)), + _createElementVNode("button", { + class: "btn-mini", + onClick: _ctx.addOpenclawEnvItem + }, "添加变量", 8 /* PROPS */, ["onClick"]) + ]) + ]), + _createElementVNode("div", { class: "structured-card" }, [ + _createElementVNode("div", { class: "structured-card-title" }, "Tools"), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "Profile"), + _withDirectives(_createElementVNode("select", { + "onUpdate:modelValue": $event => ((_ctx.openclawStructured.toolsProfile) = $event), + class: "form-input" + }, [ + _createElementVNode("option", { value: "default" }, "default"), + _createElementVNode("option", { value: "strict" }, "strict"), + _createElementVNode("option", { value: "permissive" }, "permissive"), + _createElementVNode("option", { value: "custom" }, "custom") + ], 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelSelect, _ctx.openclawStructured.toolsProfile] + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "Allow"), + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.openclawStructured.toolsAllow, (item, index) => { + return (_openBlock(), _createElementBlock("div", { + class: "list-row", + key: 'allow-' + index + }, [ + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawStructured.toolsAllow[index]) = $event), + class: "form-input", + placeholder: "例如: fs.read*" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.openclawStructured.toolsAllow[index]] + ]), + _createElementVNode("button", { + class: "btn-mini delete", + onClick: $event => (_ctx.removeOpenclawToolsAllow(index)) + }, "删除", 8 /* PROPS */, ["onClick"]) + ])) + }), 128 /* KEYED_FRAGMENT */)), + _createElementVNode("button", { + class: "btn-mini", + onClick: _ctx.addOpenclawToolsAllow + }, "添加 allow", 8 /* PROPS */, ["onClick"]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "Deny"), + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.openclawStructured.toolsDeny, (item, index) => { + return (_openBlock(), _createElementBlock("div", { + class: "list-row", + key: 'deny-' + index + }, [ + _withDirectives(_createElementVNode("input", { + "onUpdate:modelValue": $event => ((_ctx.openclawStructured.toolsDeny[index]) = $event), + class: "form-input", + placeholder: "例如: net.*" + }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [ + [_vModelText, _ctx.openclawStructured.toolsDeny[index]] + ]), + _createElementVNode("button", { + class: "btn-mini delete", + onClick: $event => (_ctx.removeOpenclawToolsDeny(index)) + }, "删除", 8 /* PROPS */, ["onClick"]) + ])) + }), 128 /* KEYED_FRAGMENT */)), + _createElementVNode("button", { + class: "btn-mini", + onClick: _ctx.addOpenclawToolsDeny + }, "添加 deny", 8 /* PROPS */, ["onClick"]) + ]) + ]), + _createElementVNode("div", { class: "structured-card" }, [ + _createElementVNode("div", { class: "structured-card-title" }, "Providers(只读)"), + (_ctx.openclawProviders.length === 0) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "form-hint" + }, " 未发现 providers 配置(可能使用环境变量或外部配置)。 ")) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "provider-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.openclawProviders, (provider, index) => { + return (_openBlock(), _createElementBlock("div", { + class: "provider-item", + key: provider.key + '-' + provider.source + '-' + index + }, [ + _createElementVNode("div", { class: "provider-header" }, [ + _createElementVNode("span", { class: "provider-name" }, _toDisplayString(provider.key), 1 /* TEXT */), + _createElementVNode("span", { class: "provider-source" }, "来源: " + _toDisplayString(provider.source), 1 /* TEXT */), + (provider.isActive) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: "pill configured" + }, "使用中")) + : _createCommentVNode("v-if", true) + ]), + (provider.fields.length === 0) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "form-hint" + }, "未配置字段")) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "provider-fields" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(provider.fields, (field) => { + return (_openBlock(), _createElementBlock("div", { + class: "provider-field", + key: provider.key + '-' + field.key + }, [ + _createElementVNode("span", { class: "provider-field-key" }, _toDisplayString(field.key), 1 /* TEXT */), + _createElementVNode("span", { class: "provider-field-value" }, _toDisplayString(field.value), 1 /* TEXT */) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ])), + (_ctx.openclawMissingProviders.length) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "form-hint" + }, " 使用中的 provider 未在配置中显示:" + _toDisplayString(_ctx.openclawMissingProviders.join(', ')) + "。 ", 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "structured-card" }, [ + _createElementVNode("div", { class: "structured-card-title" }, "Agents(只读)"), + (_ctx.openclawAgentsList.length === 0) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "form-hint" + }, " 未发现 agents.list 配置。 ")) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "agent-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.openclawAgentsList, (agent, index) => { + return (_openBlock(), _createElementBlock("div", { + class: "agent-item", + key: agent.key + '-' + index + }, [ + _createElementVNode("div", { class: "agent-header" }, [ + _createElementVNode("span", { class: "agent-name" }, _toDisplayString(agent.name), 1 /* TEXT */), + _createElementVNode("span", { class: "agent-id" }, "ID: " + _toDisplayString(agent.id), 1 /* TEXT */) + ]), + (agent.theme || agent.emoji || agent.avatar) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "agent-meta" + }, [ + (agent.theme) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, "主题: " + _toDisplayString(agent.theme), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (agent.emoji) + ? (_openBlock(), _createElementBlock("span", { key: 1 }, "表情: " + _toDisplayString(agent.emoji), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (agent.avatar) + ? (_openBlock(), _createElementBlock("span", { key: 2 }, "头像: " + _toDisplayString(agent.avatar), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ])) + : _createCommentVNode("v-if", true) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ]) + ]), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-confirm secondary", + onClick: _ctx.syncOpenclawStructuredFromText + }, "从文本刷新", 8 /* PROPS */, ["onClick"]), + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.applyOpenclawStructuredToText + }, _toDisplayString(_ctx.t('common.writeToEditor')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, "OpenClaw 配置(JSON5)"), + _withDirectives(_createElementVNode("textarea", { + "onUpdate:modelValue": $event => ((_ctx.openclawEditing.content) = $event), + class: "form-input template-editor", + spellcheck: "false", + readonly: _ctx.openclawSaving || _ctx.openclawApplying, + placeholder: "在这里编辑 OpenClaw 配置(JSON5)" + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "readonly"]), [ + [_vModelText, _ctx.openclawEditing.content] + ]), + _createElementVNode("div", { class: "template-editor-warning" }, [ + (_ctx.openclawEditing.lockName && _ctx.openclawEditing.name === '默认配置') + ? (_openBlock(), _createElementBlock("span", { key: 0 }, "默认配置始终映射当前 openclaw.json,请直接使用“保存并应用”。")) + : (_openBlock(), _createElementBlock("span", { key: 1 }, "保存仅写入本地配置库。点击“保存并应用”后会写入 openclaw.json。")) + ]) + ]), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-cancel", + onClick: _ctx.closeOpenclawConfigModal, + disabled: _ctx.openclawSaving || _ctx.openclawApplying + }, "取消", 8 /* PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.saveOpenclawConfig, + disabled: _ctx.openclawSaving || _ctx.openclawApplying || (_ctx.openclawEditing.lockName && _ctx.openclawEditing.name === '默认配置') + }, _toDisplayString(_ctx.openclawSaving ? '保存中...' : '保存'), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + class: "btn btn-confirm secondary", + onClick: _ctx.saveAndApplyOpenclawConfig, + disabled: _ctx.openclawSaving || _ctx.openclawApplying + }, _toDisplayString(_ctx.openclawApplying ? '应用中...' : '保存并应用'), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + (_ctx.showConfigTemplateModal) + ? (_openBlock(), _createElementBlock("div", { + key: 12, + class: "modal-overlay", + onClick: _withModifiers($event => (!_ctx.configTemplateApplying && _ctx.closeConfigTemplateModal()), ["self"]) + }, [ + _createElementVNode("div", { + class: "modal modal-wide", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "config-template-modal-title" + }, [ + _createElementVNode("div", { class: "modal-header modal-editor-header" }, [ + _createElementVNode("div", { + class: "modal-title", + id: "config-template-modal-title" + }, _toDisplayString(_ctx.t('modal.configTemplate.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "modal-header-actions" }, [ + _createElementVNode("button", { + class: "btn-mini btn-modal-copy", + onClick: _ctx.pasteConfigTemplateContent, + disabled: _ctx.configTemplateApplying || _ctx.configTemplateDiffLoading || _ctx.configTemplateDiffVisible + }, _toDisplayString(_ctx.t('common.paste')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.configTemplate.label')), 1 /* TEXT */), + (_ctx.configTemplateDiffVisible) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "agents-diff-container" + }, [ + _createElementVNode("div", { class: "agents-diff-header" }, [ + _createElementVNode("div", { class: "agents-diff-title" }, [ + _createTextVNode(_toDisplayString(_ctx.t('diff.title.configTemplate')) + " ", 1 /* TEXT */), + (_ctx.configTemplateDiffLoading) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: "agents-diff-subtitle" + }, _toDisplayString(_ctx.t('diff.generating')), 1 /* TEXT */)) + : (_ctx.configTemplateDiffError) + ? (_openBlock(), _createElementBlock("span", { + key: 1, + class: "agents-diff-subtitle" + }, _toDisplayString(_ctx.t('diff.failed')), 1 /* TEXT */)) + : (!_ctx.configTemplateDiffHasChanges) + ? (_openBlock(), _createElementBlock("span", { + key: 2, + class: "agents-diff-subtitle" + }, _toDisplayString(_ctx.t('diff.noChanges')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + _createElementVNode("div", { class: "agents-diff-stats" }, [ + _createElementVNode("span", { class: "agents-diff-stat add" }, "+" + _toDisplayString(_ctx.configTemplateDiffStats.added || 0), 1 /* TEXT */), + _createElementVNode("span", { class: "agents-diff-stat del" }, "-" + _toDisplayString(_ctx.configTemplateDiffStats.removed || 0), 1 /* TEXT */), + _createElementVNode("span", { class: "agents-diff-stat" }, "=" + _toDisplayString(_ctx.configTemplateDiffStats.unchanged || 0), 1 /* TEXT */) + ]) + ]), + (_ctx.configTemplateDiffError) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "agents-diff-error" + }, _toDisplayString(_ctx.configTemplateDiffError), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "agents-diff-lines" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.configTemplateDiffLines, (line, index) => { + return (_openBlock(), _createElementBlock("div", { + key: line.key || (line.type + '-' + index), + class: _normalizeClass(['agents-diff-line', line.type]) + }, [ + _createElementVNode("span", { class: "agents-diff-line-sign" }, _toDisplayString(line.type === 'add' ? '+' : (line.type === 'del' ? '-' : ' ')), 1 /* TEXT */), + _createElementVNode("span", { class: "agents-diff-line-text" }, _toDisplayString(line.value), 1 /* TEXT */) + ], 2 /* CLASS */)) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ])) + : _withDirectives((_openBlock(), _createElementBlock("textarea", { + key: 1, + "onUpdate:modelValue": $event => ((_ctx.configTemplateContent) = $event), + class: "form-input template-editor", + spellcheck: "false", + readonly: _ctx.configTemplateApplying || _ctx.configTemplateDiffLoading, + onInput: _ctx.onConfigTemplateContentInput, + placeholder: _ctx.t('modal.configTemplate.placeholder') + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "readonly", "onInput", "placeholder"])), [ + [_vModelText, _ctx.configTemplateContent] + ]), + _createElementVNode("div", { class: "template-editor-warning" }, [ + (_ctx.configTemplateDiffConfirmEnabled) + ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [ + _createTextVNode(_toDisplayString(_ctx.t('modal.configTemplate.mode.twoStep')), 1 /* TEXT */) + ], 64 /* STABLE_FRAGMENT */)) + : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [ + _createTextVNode(_toDisplayString(_ctx.t('modal.configTemplate.mode.oneStep')), 1 /* TEXT */) + ], 64 /* STABLE_FRAGMENT */)), + (_ctx.configTemplateDiffVisible && (_ctx.configTemplateDiffLoading || _ctx.configTemplateApplying)) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "agents-diff-hint" + }, _toDisplayString(_ctx.t('diff.hint.busy')), 1 /* TEXT */)) + : (_ctx.configTemplateDiffVisible && _ctx.configTemplateDiffError) + ? (_openBlock(), _createElementBlock("div", { + key: 3, + class: "agents-diff-hint" + }, _toDisplayString(_ctx.t('diff.hint.failedBack')), 1 /* TEXT */)) + : (_ctx.configTemplateDiffVisible && !_ctx.configTemplateDiffHasChanges) + ? (_openBlock(), _createElementBlock("div", { + key: 4, + class: "agents-diff-hint" + }, _toDisplayString(_ctx.t('diff.hint.noChangesBack')), 1 /* TEXT */)) + : (_ctx.configTemplateDiffVisible) + ? (_openBlock(), _createElementBlock("div", { + key: 5, + class: "agents-diff-hint" + }, _toDisplayString(_ctx.t('diff.hint.previewMode')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ]), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-cancel", + onClick: _ctx.closeConfigTemplateModal, + disabled: _ctx.configTemplateApplying || _ctx.configTemplateDiffLoading + }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + (_ctx.configTemplateDiffVisible) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + class: "btn", + onClick: _ctx.resetConfigTemplateDiffState, + disabled: _ctx.configTemplateApplying || _ctx.configTemplateDiffLoading + }, _toDisplayString(_ctx.t('common.backToEdit')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])) + : _createCommentVNode("v-if", true), + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.applyConfigTemplate, + disabled: _ctx.configTemplateApplying || _ctx.configTemplateDiffLoading || (_ctx.configTemplateDiffVisible && !_ctx.configTemplateDiffHasChanges) + }, _toDisplayString(_ctx.configTemplateApplying + ? (_ctx.configTemplateDiffVisible || !_ctx.configTemplateDiffConfirmEnabled ? _ctx.t('common.applying') : _ctx.t('common.confirming')) + : (_ctx.configTemplateDiffVisible || !_ctx.configTemplateDiffConfirmEnabled ? _ctx.t('common.apply') : _ctx.t('common.confirm'))), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + (_ctx.showAgentsModal) + ? (_openBlock(), _createElementBlock("div", { + key: 13, + class: "modal-overlay", + onClick: _withModifiers(_ctx.closeAgentsModal, ["self"]) + }, [ + _createElementVNode("div", { + class: "modal modal-wide modal-editor agents-modal", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "agents-modal-title" + }, [ + _createElementVNode("div", { class: "modal-header modal-editor-header" }, [ + _createElementVNode("div", { + class: "modal-title", + id: "agents-modal-title" + }, _toDisplayString(_ctx.agentsModalTitle), 1 /* TEXT */), + _createElementVNode("div", { class: "modal-header-actions" }, [ + _createElementVNode("button", { + class: "btn-mini btn-modal-copy", + onClick: _ctx.exportAgentsContent, + disabled: _ctx.agentsLoading + }, _toDisplayString(_ctx.t('modal.agents.export')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + class: "btn-mini btn-modal-copy", + onClick: _ctx.copyAgentsContent, + disabled: _ctx.agentsLoading + }, _toDisplayString(_ctx.t('modal.agents.copy')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + class: "btn-mini btn-modal-copy", + onClick: _ctx.pasteAgentsContent, + disabled: _ctx.agentsLoading || _ctx.agentsSaving || _ctx.agentsDiffVisible + }, _toDisplayString(_ctx.t('common.paste')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + _createElementVNode("div", { class: "modal-editor-body" }, [ + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.agents.targetFile')), 1 /* TEXT */), + _createElementVNode("div", { class: "form-hint" }, [ + _createTextVNode(_toDisplayString(_ctx.agentsPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */), + (_ctx.agentsPath) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, " (" + _toDisplayString(_ctx.agentsExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnSave')) + ") ", 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]) + ]), + _createElementVNode("div", { class: "form-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t(_ctx.agentsContext === 'claude-md' ? 'modal.agents.contentLabel.claudeMd' : 'modal.agents.contentLabel')), 1 /* TEXT */), + (!_ctx.agentsLoading && (_ctx.hasAgentsContentChanged() || _ctx.agentsDiffVisible)) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "agents-diff-save-alert" + }, _toDisplayString(_ctx.agentsDiffVisible ? _ctx.t('modal.agents.unsaved.previewModeHint') : _ctx.t('modal.agents.unsaved.detectedHint')), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.agentsDiffVisible) + ? (_openBlock(), _createElementBlock("div", { key: 1 }, [ + (!_ctx.agentsDiffLoading && !_ctx.agentsDiffError && !_ctx.agentsDiffTruncated && (_ctx.agentsDiffStats.added || _ctx.agentsDiffStats.removed)) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "agents-diff-summary" + }, [ + _createElementVNode("span", { class: "agents-diff-stat add" }, "+" + _toDisplayString(_ctx.agentsDiffStats.added), 1 /* TEXT */), + _createElementVNode("span", { class: "agents-diff-stat del" }, "-" + _toDisplayString(_ctx.agentsDiffStats.removed), 1 /* TEXT */) + ])) + : _createCommentVNode("v-if", true), + (_ctx.agentsDiffLoading) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "state-message" + }, _toDisplayString(_ctx.t('diff.generating')), 1 /* TEXT */)) + : (_ctx.agentsDiffError) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "state-message error" + }, _toDisplayString(_ctx.agentsDiffError), 1 /* TEXT */)) + : (_ctx.agentsDiffTruncated) + ? (_openBlock(), _createElementBlock("div", { + key: 3, + class: "agents-diff-empty" + }, _toDisplayString(_ctx.t('diff.tooLargeSkip')), 1 /* TEXT */)) + : (!_ctx.agentsDiffHasChanges) + ? (_openBlock(), _createElementBlock("div", { + key: 4, + class: "agents-diff-empty" + }, _toDisplayString(_ctx.t('diff.noChanges')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 5, + class: "agents-diff-view agents-diff-editor" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.agentsDiffLines, (line, index) => { + return (_openBlock(), _createElementBlock("div", { + key: line.key || (line.type + '-' + index), + class: _normalizeClass(['agents-diff-line', line.type]) + }, [ + _createElementVNode("span", { class: "agents-diff-line-sign" }, _toDisplayString(line.type === 'add' ? '+' : (line.type === 'del' ? '-' : ' ')), 1 /* TEXT */), + _createElementVNode("span", { class: "agents-diff-line-text" }, _toDisplayString(line.value), 1 /* TEXT */) + ], 2 /* CLASS */)) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ])) + : _createCommentVNode("v-if", true), + _withDirectives(_createElementVNode("textarea", { + "onUpdate:modelValue": $event => ((_ctx.agentsContent) = $event), + class: "form-input template-editor", + spellcheck: "false", + readonly: _ctx.agentsLoading || _ctx.agentsSaving || _ctx.agentsDiffVisible, + onInput: _ctx.onAgentsContentInput, + placeholder: _ctx.t(_ctx.agentsContext === 'claude-md' ? 'modal.agents.placeholder.claudeMd' : 'modal.agents.placeholder') + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "readonly", "onInput", "placeholder"]), [ + [_vModelText, _ctx.agentsContent] + ]), + _createElementVNode("div", { class: "template-editor-warning" }, [ + _createTextVNode(_toDisplayString(_ctx.agentsModalHint) + " ", 1 /* TEXT */), + _createElementVNode("div", { class: "agents-diff-hint" }, _toDisplayString(_ctx.t('modal.agents.hint.shortcuts')), 1 /* TEXT */), + (!_ctx.agentsDiffVisible) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "agents-diff-hint" + }, _toDisplayString(_ctx.t('modal.agents.hint.twoStepSave')), 1 /* TEXT */)) + : (_ctx.agentsDiffLoading || _ctx.agentsSaving) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "agents-diff-hint" + }, _toDisplayString(_ctx.t('diff.hint.busy')), 1 /* TEXT */)) + : (_ctx.agentsDiffError) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "agents-diff-hint" + }, _toDisplayString(_ctx.t('diff.hint.failedBack')), 1 /* TEXT */)) + : (!_ctx.agentsDiffHasChanges) + ? (_openBlock(), _createElementBlock("div", { + key: 3, + class: "agents-diff-hint" + }, _toDisplayString(_ctx.t('diff.hint.noChangesBack')), 1 /* TEXT */)) + : (_ctx.agentsDiffTruncated) + ? (_openBlock(), _createElementBlock("div", { + key: 4, + class: "agents-diff-hint" + }, _toDisplayString(_ctx.t('diff.viewHint.truncated')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 5, + class: "agents-diff-hint" + }, _toDisplayString(_ctx.t('diff.viewHint.preview')), 1 /* TEXT */)) + ]) + ]) + ]), + _createElementVNode("div", { class: "btn-group modal-editor-footer" }, [ + _createElementVNode("button", { + class: "btn btn-cancel", + onClick: _ctx.closeAgentsModal, + disabled: _ctx.agentsSaving || _ctx.agentsDiffLoading + }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + (_ctx.agentsDiffVisible) + ? (_openBlock(), _createElementBlock("button", { + key: 0, + class: "btn", + onClick: _ctx.resetAgentsDiffState, + disabled: _ctx.agentsSaving || _ctx.agentsDiffLoading + }, _toDisplayString(_ctx.t('common.backToEdit')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])) + : _createCommentVNode("v-if", true), + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.applyAgentsContent, + disabled: _ctx.agentsSaving || _ctx.agentsLoading || _ctx.agentsDiffLoading || (_ctx.agentsDiffVisible && !_ctx.agentsDiffHasChanges) + }, _toDisplayString(_ctx.agentsSaving ? (_ctx.agentsDiffVisible ? _ctx.t('common.applying') : _ctx.t('common.confirming')) : (_ctx.agentsDiffVisible ? _ctx.t('common.apply') : _ctx.t('common.confirm'))), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + (_ctx.showSkillsModal) + ? (_openBlock(), _createElementBlock("div", { + key: 14, + class: "modal-overlay", + onClick: _withModifiers(_ctx.closeSkillsModal, ["self"]) + }, [ + _createElementVNode("div", { + class: "modal modal-wide skills-modal", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "skills-modal-title" + }, [ + _createElementVNode("div", { class: "modal-header skills-modal-header" }, [ + _createElementVNode("div", null, [ + _createElementVNode("div", { + class: "modal-title", + id: "skills-modal-title" + }, _toDisplayString(_ctx.t('modal.skills.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-modal-subtitle" }, _toDisplayString(_ctx.t('modal.skills.subtitle')), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "modal-header-actions skills-modal-actions" }, [ + _createElementVNode("div", { + class: "market-target-switch market-target-switch-compact", + role: "group", + "aria-label": _ctx.t('modal.skills.target.aria') + }, [ + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['market-target-chip', { active: _ctx.skillsTargetApp === 'codex' }]), + "aria-pressed": _ctx.skillsTargetApp === 'codex', + disabled: _ctx.loading || !!_ctx.initError || _ctx.skillsMarketBusy, + onClick: $event => (_ctx.setSkillsTargetApp('codex', { silent: false })) + }, " Codex ", 10 /* CLASS, PROPS */, ["aria-pressed", "disabled", "onClick"]), + _createElementVNode("button", { + type: "button", + class: _normalizeClass(['market-target-chip', { active: _ctx.skillsTargetApp === 'claude' }]), + "aria-pressed": _ctx.skillsTargetApp === 'claude', + disabled: _ctx.loading || !!_ctx.initError || _ctx.skillsMarketBusy, + onClick: $event => (_ctx.setSkillsTargetApp('claude', { silent: false })) + }, " Claude Code ", 10 /* CLASS, PROPS */, ["aria-pressed", "disabled", "onClick"]) + ], 8 /* PROPS */, ["aria-label"]), + _createElementVNode("button", { + class: "btn-mini", + onClick: $event => (_ctx.refreshSkillsList({ silent: false })), + disabled: _ctx.skillsLoading || _ctx.skillsDeleting || _ctx.skillsScanningImports || _ctx.skillsImporting || _ctx.skillsZipImporting || _ctx.skillsExporting + }, _toDisplayString(_ctx.skillsLoading ? _ctx.t('common.refreshing') : _ctx.t('common.refresh')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]), + _createElementVNode("div", { class: "form-group skills-root-group" }, [ + _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('modal.skills.rootDir', { label: _ctx.skillsTargetLabel })), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-root-box" }, _toDisplayString(_ctx.skillsRootPath || _ctx.skillsDefaultRootPath), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "skills-summary-strip" }, [ + _createElementVNode("div", { class: "skills-summary-item" }, [ + _createElementVNode("span", { class: "skills-summary-label" }, _toDisplayString(_ctx.t('modal.skills.summary.target')), 1 /* TEXT */), + _createElementVNode("strong", { class: "skills-summary-value" }, _toDisplayString(_ctx.skillsTargetLabel), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "skills-summary-item" }, [ + _createElementVNode("span", { class: "skills-summary-label" }, _toDisplayString(_ctx.t('modal.skills.summary.total')), 1 /* TEXT */), + _createElementVNode("strong", { class: "skills-summary-value" }, _toDisplayString(_ctx.skillsList.length), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "skills-summary-item" }, [ + _createElementVNode("span", { class: "skills-summary-label" }, _toDisplayString(_ctx.t('modal.skills.summary.withSkill')), 1 /* TEXT */), + _createElementVNode("strong", { class: "skills-summary-value" }, _toDisplayString(_ctx.skillsConfiguredCount), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "skills-summary-item" }, [ + _createElementVNode("span", { class: "skills-summary-label" }, _toDisplayString(_ctx.t('modal.skills.summary.missingSkill')), 1 /* TEXT */), + _createElementVNode("strong", { class: "skills-summary-value" }, _toDisplayString(_ctx.skillsMissingSkillFileCount), 1 /* TEXT */) + ]), + _createElementVNode("div", { class: "skills-summary-item" }, [ + _createElementVNode("span", { class: "skills-summary-label" }, _toDisplayString(_ctx.t('modal.skills.summary.importable')), 1 /* TEXT */), + _createElementVNode("strong", { class: "skills-summary-value" }, _toDisplayString(_ctx.skillsImportList.length), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { + class: "skills-manager-grid", + "aria-label": _ctx.t('modal.skills.panel.aria') + }, [ + _createElementVNode("div", { class: "skills-manager-col skills-manager-left" }, [ + _createElementVNode("div", { class: "skills-panel" }, [ + _createElementVNode("div", { class: "skills-panel-header" }, [ + _createElementVNode("div", { class: "skills-panel-title-wrap" }, [ + _createElementVNode("div", { class: "skills-panel-title" }, _toDisplayString(_ctx.t('modal.skills.local.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-panel-note" }, _toDisplayString(_ctx.t('modal.skills.local.note')), 1 /* TEXT */) + ]), + _createElementVNode("button", { + class: "btn-mini", + onClick: _ctx.resetSkillsFilters, + disabled: _ctx.skillsLoading || _ctx.skillsDeleting || !_ctx.skillsFilterDirty + }, _toDisplayString(_ctx.t('common.resetFilters')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]), + _createElementVNode("div", { class: "skills-filter-row" }, [ + _withDirectives(_createElementVNode("input", { + class: "form-input", + type: "text", + "onUpdate:modelValue": $event => ((_ctx.skillsKeyword) = $event), + "aria-label": _ctx.t('modal.skills.filter.keywordAria'), + placeholder: _ctx.t('modal.skills.filter.keywordPlaceholder') + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "aria-label", "placeholder"]), [ + [ + _vModelText, + _ctx.skillsKeyword, + void 0, + { trim: true } + ] + ]), + _withDirectives(_createElementVNode("select", { + class: "form-select skills-status-select", + "onUpdate:modelValue": $event => ((_ctx.skillsStatusFilter) = $event), + "aria-label": _ctx.t('modal.skills.filter.statusAria') + }, [ + _createElementVNode("option", { value: "all" }, _toDisplayString(_ctx.t('modal.skills.filter.status.all')), 1 /* TEXT */), + _createElementVNode("option", { value: "with-skill-file" }, _toDisplayString(_ctx.t('modal.skills.filter.status.withSkill')), 1 /* TEXT */), + _createElementVNode("option", { value: "missing-skill-file" }, _toDisplayString(_ctx.t('modal.skills.filter.status.missingSkill')), 1 /* TEXT */) + ], 8 /* PROPS */, ["onUpdate:modelValue", "aria-label"]), [ + [_vModelSelect, _ctx.skillsStatusFilter] + ]) + ]), + _createElementVNode("div", { class: "skill-toolbar" }, [ + _createElementVNode("label", { class: "skill-select-all" }, [ + _createElementVNode("input", { + type: "checkbox", + checked: _ctx.skillsAllSelected, + onChange: _ctx.toggleAllSkillsSelection, + disabled: _ctx.skillsLoading || _ctx.skillsDeleting || _ctx.skillsSelectableNames.length === 0 + }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange", "disabled"]), + _createElementVNode("span", null, _toDisplayString(_ctx.skillsAllSelected ? _ctx.t('common.unselectAll') : _ctx.t('common.selectAll')), 1 /* TEXT */) + ]), + _createElementVNode("span", { class: "skill-toolbar-count" }, _toDisplayString(_ctx.t('modal.skills.selection.stats', { selected: _ctx.skillsSelectedCount, filtered: _ctx.filteredSkillsList.length, total: _ctx.skillsList.length, visibleSelected: _ctx.skillsVisibleSelectedCount })), 1 /* TEXT */) + ]), + (_ctx.skillsList.length === 0) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "skills-empty-state" + }, _toDisplayString(_ctx.t('modal.skills.empty.local')), 1 /* TEXT */)) + : (_ctx.filteredSkillsList.length === 0) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "skills-empty-state" + }, _toDisplayString(_ctx.t('modal.skills.empty.filtered')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 2, + class: "skill-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.filteredSkillsList, (skill) => { + return (_openBlock(), _createElementBlock("label", { + class: _normalizeClass(["skill-item", { selected: _ctx.skillsSelectedNames.includes(skill.name) }]), + key: 'skill-' + skill.name + }, [ + _withDirectives(_createElementVNode("input", { + type: "checkbox", + "onUpdate:modelValue": $event => ((_ctx.skillsSelectedNames) = $event), + value: skill.name, + disabled: _ctx.skillsDeleting + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "value", "disabled"]), [ + [_vModelCheckbox, _ctx.skillsSelectedNames] + ]), + _createElementVNode("div", { class: "skill-item-main" }, [ + _createElementVNode("div", { class: "skill-item-title" }, _toDisplayString(skill.displayName || skill.name), 1 /* TEXT */), + (skill.description) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "skill-item-description" + }, _toDisplayString(skill.description), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "skill-item-meta" }, [ + _createElementVNode("span", { + class: "skill-item-path", + title: skill.path + }, _toDisplayString(skill.path), 9 /* TEXT, PROPS */, ["title"]), + _createElementVNode("span", { + class: _normalizeClass(['pill', skill.hasSkillFile ? 'configured' : 'empty']) + }, _toDisplayString(skill.hasSkillFile ? _ctx.t('modal.skills.pill.hasSkillFile') : _ctx.t('modal.skills.pill.missingSkillFile')), 3 /* TEXT, CLASS */), + _createElementVNode("span", { class: "pill source" }, _toDisplayString(skill.sourceType === 'symlink' ? _ctx.t('modal.skills.pill.symlink') : _ctx.t('modal.skills.pill.dir')), 1 /* TEXT */) + ]) + ]) + ], 2 /* CLASS */)) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ]) + ]), + _createElementVNode("div", { class: "skills-manager-col skills-manager-right" }, [ + _createElementVNode("div", { class: "skills-panel skills-import-block" }, [ + _createElementVNode("div", { class: "skills-panel-header" }, [ + _createElementVNode("div", { class: "skills-panel-title-wrap" }, [ + _createElementVNode("div", { class: "skills-import-title" }, _toDisplayString(_ctx.t('modal.skills.import.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-panel-note" }, _toDisplayString(_ctx.t('modal.skills.import.note', { label: _ctx.skillsTargetLabel })), 1 /* TEXT */) + ]), + _createElementVNode("button", { + class: "btn-mini", + onClick: _ctx.scanImportableSkills, + disabled: _ctx.skillsLoading || _ctx.skillsDeleting || _ctx.skillsScanningImports || _ctx.skillsImporting || _ctx.skillsZipImporting || _ctx.skillsExporting + }, _toDisplayString(_ctx.skillsScanningImports ? _ctx.t('common.scanning') : _ctx.t('modal.skills.import.scan')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]), + _createElementVNode("div", { class: "skill-toolbar" }, [ + _createElementVNode("label", { class: "skill-select-all" }, [ + _createElementVNode("input", { + type: "checkbox", + checked: _ctx.skillsImportAllSelected, + onChange: _ctx.toggleAllSkillsImportSelection, + disabled: _ctx.skillsScanningImports || _ctx.skillsImporting || _ctx.skillsImportSelectableKeys.length === 0 + }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange", "disabled"]), + _createElementVNode("span", null, _toDisplayString(_ctx.skillsImportAllSelected ? _ctx.t('common.unselectAll') : _ctx.t('common.selectAll')), 1 /* TEXT */) + ]), + _createElementVNode("span", { class: "skill-toolbar-count" }, _toDisplayString(_ctx.t('modal.skills.import.stats', { selected: _ctx.skillsImportSelectedCount, total: _ctx.skillsImportSelectableKeys.length, configured: _ctx.skillsImportConfiguredCount, missing: _ctx.skillsImportMissingSkillFileCount })), 1 /* TEXT */) + ]), + (_ctx.skillsImportList.length === 0) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "skills-empty-state skills-import-empty" + }, _toDisplayString(_ctx.t('modal.skills.import.emptyHint')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("div", { + key: 1, + class: "skill-list skills-import-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.skillsImportList, (skill) => { + return (_openBlock(), _createElementBlock("label", { + class: _normalizeClass(["skill-item", { selected: _ctx.skillsImportSelectedKeys.includes(_ctx.buildSkillImportKey(skill)) }]), + key: 'import-skill-' + _ctx.buildSkillImportKey(skill) + }, [ + _withDirectives(_createElementVNode("input", { + type: "checkbox", + "onUpdate:modelValue": $event => ((_ctx.skillsImportSelectedKeys) = $event), + value: _ctx.buildSkillImportKey(skill), + disabled: _ctx.skillsImporting + }, null, 8 /* PROPS */, ["onUpdate:modelValue", "value", "disabled"]), [ + [_vModelCheckbox, _ctx.skillsImportSelectedKeys] + ]), + _createElementVNode("div", { class: "skill-item-main" }, [ + _createElementVNode("div", { class: "skill-item-title" }, _toDisplayString(skill.displayName || skill.name), 1 /* TEXT */), + (skill.description) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "skill-item-description" + }, _toDisplayString(skill.description), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + _createElementVNode("div", { class: "skill-item-meta" }, [ + _createElementVNode("span", { + class: "skill-item-path", + title: skill.sourcePath + }, _toDisplayString(skill.sourcePath), 9 /* TEXT, PROPS */, ["title"]), + _createElementVNode("span", { class: "pill source" }, _toDisplayString(skill.sourceLabel), 1 /* TEXT */), + _createElementVNode("span", { + class: _normalizeClass(['pill', skill.hasSkillFile ? 'configured' : 'empty']) + }, _toDisplayString(skill.hasSkillFile ? _ctx.t('modal.skills.pill.hasSkillFile') : _ctx.t('modal.skills.pill.missingSkillFile')), 3 /* TEXT, CLASS */) + ]) + ]) + ], 2 /* CLASS */)) + }), 128 /* KEYED_FRAGMENT */)) + ])) + ]), + _createElementVNode("div", { class: "skills-panel skills-actions-panel" }, [ + _createElementVNode("div", { class: "skills-panel-header" }, [ + _createElementVNode("div", { class: "skills-panel-title-wrap" }, [ + _createElementVNode("div", { class: "skills-panel-title" }, _toDisplayString(_ctx.t('modal.skills.bulk.title')), 1 /* TEXT */), + _createElementVNode("div", { class: "skills-panel-note" }, _toDisplayString(_ctx.t('modal.skills.bulk.note')), 1 /* TEXT */) + ]) + ]), + _createElementVNode("div", { class: "skills-actions-grid" }, [ + _createElementVNode("button", { + class: "btn btn-cancel", + onClick: _ctx.triggerSkillsZipImport, + disabled: _ctx.skillsZipImporting || _ctx.skillsDeleting || _ctx.skillsImporting || _ctx.skillsScanningImports || _ctx.skillsExporting + }, _toDisplayString(_ctx.skillsZipImporting ? _ctx.t('modal.skills.actions.zipImporting') : _ctx.t('modal.skills.actions.zipImport')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: _ctx.exportSelectedSkills, + disabled: _ctx.skillsExporting || _ctx.skillsSelectedCount === 0 || _ctx.skillsDeleting || _ctx.skillsImporting || _ctx.skillsScanningImports || _ctx.skillsZipImporting + }, _toDisplayString(_ctx.skillsExporting ? _ctx.t('modal.skills.actions.exporting') : _ctx.t('modal.skills.actions.exportSelected')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + class: "btn btn-confirm secondary", + onClick: _ctx.importSelectedSkills, + disabled: _ctx.skillsImporting || _ctx.skillsScanningImports || _ctx.skillsImportSelectedCount === 0 || _ctx.skillsZipImporting || _ctx.skillsExporting || _ctx.skillsDeleting + }, _toDisplayString(_ctx.skillsImporting ? _ctx.t('modal.skills.actions.importing') : _ctx.t('modal.skills.actions.importSelected')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + class: "btn btn-confirm btn-danger", + onClick: _ctx.deleteSelectedSkills, + disabled: _ctx.skillsDeleting || _ctx.skillsSelectedCount === 0 || _ctx.skillsImporting || _ctx.skillsZipImporting || _ctx.skillsExporting + }, _toDisplayString(_ctx.skillsDeleting ? _ctx.t('modal.skills.actions.deleting') : _ctx.t('modal.skills.actions.deleteSelected')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]), + _createElementVNode("button", { + class: "btn btn-cancel skills-close-btn", + onClick: _ctx.closeSkillsModal, + disabled: _ctx.skillsLoading || _ctx.skillsDeleting || _ctx.skillsImporting || _ctx.skillsScanningImports || _ctx.skillsZipImporting || _ctx.skillsExporting + }, _toDisplayString(_ctx.t('common.close')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]) + ]) + ]) + ]) + ], 8 /* PROPS */, ["aria-label"]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + _createElementVNode("input", { + ref: "skillsZipImportInput", + type: "file", + accept: ".zip,application/zip", + style: {"display":"none"}, + onChange: _ctx.handleSkillsZipImportChange + }, null, 40 /* PROPS, NEED_HYDRATION */, ["onChange"]), + (_ctx.showHealthCheckModal) + ? (_openBlock(), _createElementBlock("div", { + key: 15, + class: "modal-overlay", + onClick: _withModifiers($event => (_ctx.showHealthCheckModal = false), ["self"]) + }, [ + _createElementVNode("div", { + class: "modal", + role: "dialog", + "aria-modal": "true", + "aria-labelledby": "health-check-modal-title" + }, [ + _createElementVNode("div", { + class: "modal-title", + id: "health-check-modal-title" + }, _toDisplayString(_ctx.t('config.health.title')), 1 /* TEXT */), + (!_ctx.healthCheckResult) + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "state-message" + }, _toDisplayString(_ctx.t('common.notLoaded')), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [ + _createElementVNode("div", { class: "form-hint" }, [ + _createTextVNode(_toDisplayString(_ctx.healthCheckResult.ok ? _ctx.t('config.health.ok') : _ctx.t('config.health.fail')) + " ", 1 /* TEXT */), + (_ctx.healthCheckResult.issues) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, "(" + _toDisplayString(_ctx.t('config.health.issues', { count: _ctx.healthCheckResult.issues.length })) + ")", 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ]), + (_ctx.healthCheckResult.remote && _ctx.healthCheckResult.remote.type === 'remote-health-check') + ? (_openBlock(), _createElementBlock("div", { + key: 0, + class: "form-hint" + }, [ + _createTextVNode(_toDisplayString(_ctx.healthCheckResult.remote.endpoint || '') + " ", 1 /* TEXT */), + (_ctx.healthCheckResult.remote.statusCode) + ? (_openBlock(), _createElementBlock("span", { key: 0 }, " · " + _toDisplayString(_ctx.healthCheckResult.remote.statusCode), 1 /* TEXT */)) + : _createCommentVNode("v-if", true), + (_ctx.healthCheckResult.remote.message) + ? (_openBlock(), _createElementBlock("span", { key: 1 }, " · " + _toDisplayString(_ctx.healthCheckResult.remote.message), 1 /* TEXT */)) + : _createCommentVNode("v-if", true) + ])) + : _createCommentVNode("v-if", true), + (_ctx.healthCheckResult.remote && _ctx.healthCheckResult.remote.speedTests) + ? (_openBlock(), _createElementBlock("div", { + key: 1, + class: "model-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.healthCheckResult.remote.speedTests, (result, name) => { + return (_openBlock(), _createElementBlock("div", { + key: 'health-speed-' + name, + class: "model-item" + }, [ + _createElementVNode("span", null, _toDisplayString(name), 1 /* TEXT */), + (result && result.ok) + ? (_openBlock(), _createElementBlock("span", { + key: 0, + class: "latency ok" + }, _toDisplayString(_ctx.formatLatency(result)), 1 /* TEXT */)) + : (_openBlock(), _createElementBlock("span", { + key: 1, + class: "latency error" + }, _toDisplayString((result && result.error) ? result.error : _ctx.t('config.health.fail')), 1 /* TEXT */)) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + : _createCommentVNode("v-if", true), + (_ctx.healthCheckResult.issues && _ctx.healthCheckResult.issues.length) + ? (_openBlock(), _createElementBlock("div", { + key: 2, + class: "model-list" + }, [ + (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.healthCheckResult.issues, (issue, index) => { + return (_openBlock(), _createElementBlock("div", { + key: issue.code || ('health-issue-' + index), + class: "model-item" + }, [ + _createElementVNode("span", null, _toDisplayString(issue.message || issue.code || ''), 1 /* TEXT */) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + : _createCommentVNode("v-if", true) + ], 64 /* STABLE_FRAGMENT */)), + _createElementVNode("div", { class: "btn-group" }, [ + _createElementVNode("button", { + class: "btn btn-confirm", + onClick: $event => (_ctx.showHealthCheckModal = false) + }, _toDisplayString(_ctx.t('common.close')), 9 /* TEXT, PROPS */, ["onClick"]) + ]) + ]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + (_ctx.showConfirmDialog) + ? (_openBlock(), _createElementBlock("div", { + key: 16, + class: "modal-overlay", + onClick: _withModifiers(_ctx.closeConfirmDialog, ["self"]) + }, [ + _createElementVNode("div", { + class: "modal confirm-dialog", + role: "alertdialog", + "aria-modal": "true", + "aria-describedby": "confirm-dialog-message", + "aria-labelledby": _ctx.confirmDialogTitle ? 'confirm-dialog-title' : null, + "aria-label": _ctx.confirmDialogTitle ? null : _ctx.t('confirm.aria') + }, [ + _createElementVNode("div", { + id: "confirm-dialog-title", + class: "modal-title" + }, _toDisplayString(_ctx.confirmDialogTitle), 1 /* TEXT */), + _createElementVNode("div", { + id: "confirm-dialog-message", + class: "confirm-dialog-message" + }, _toDisplayString(_ctx.confirmDialogMessage), 1 /* TEXT */), + _createElementVNode("div", { class: "btn-group confirm-dialog-actions" }, [ + _createElementVNode("button", { + class: "btn btn-cancel", + onClick: _ctx.closeConfirmDialog + }, _toDisplayString(_ctx.confirmDialogCancelText), 9 /* TEXT, PROPS */, ["onClick"]), + _createElementVNode("button", { + class: _normalizeClass(['btn', 'btn-confirm', _ctx.confirmDialogDanger ? 'btn-danger' : '']), + disabled: _ctx.isConfirmDialogDisabled(), + onClick: $event => (_ctx.resolveConfirmDialog(true)) + }, _toDisplayString(_ctx.confirmDialogConfirmText), 11 /* TEXT, CLASS, PROPS */, ["disabled", "onClick"]) + ]) + ], 8 /* PROPS */, ["aria-labelledby", "aria-label"]) + ], 8 /* PROPS */, ["onClick"])) + : _createCommentVNode("v-if", true), + _createCommentVNode(" Toast通知 "), + _createCommentVNode(" Toast "), + (_ctx.message) + ? (_openBlock(), _createElementBlock("div", { + key: 17, + class: _normalizeClass(['toast', _ctx.messageType]), + role: "status", + "aria-live": "polite", + "aria-atomic": "true" + }, _toDisplayString(_ctx.message), 3 /* TEXT, CLASS */)) + : _createCommentVNode("v-if", true) + ], 64 /* STABLE_FRAGMENT */)) +} +})(); diff --git a/web-ui/session-helpers.mjs b/web-ui/session-helpers.mjs index 15ba66b0..813762b1 100644 --- a/web-ui/session-helpers.mjs +++ b/web-ui/session-helpers.mjs @@ -90,7 +90,7 @@ export function switchMainTab(tab) { emitSessionLoadDebug(this, 'switchMainTab:start', `from=${previousTab}\nto=${nextTab}`); this.mainTab = nextTab; - if (leavingSessions) { + if (leavingSessions && this.preserveSessionRenderOnTabLeave !== true) { const teardown = () => { if (this.mainTab === 'sessions') return; if (typeof this.finalizeSessionTabTeardown === 'function') { @@ -156,7 +156,13 @@ export function switchMainTab(tab) { if (nextTab !== 'orchestration' && typeof this.stopTaskOrchestrationPolling === 'function') { this.stopTaskOrchestrationPolling(); } - if (nextTab === 'sessions') { + if ( + nextTab === 'sessions' + && ( + !this.sessionListRenderEnabled + || !this.sessionPreviewRenderEnabled + ) + ) { this.prepareSessionTabRender(); } const shouldLoadTrashListOnSettingsEnter = nextTab === 'settings' diff --git a/web-ui/source-bundle.cjs b/web-ui/source-bundle.cjs index 3af95a4c..96522474 100644 --- a/web-ui/source-bundle.cjs +++ b/web-ui/source-bundle.cjs @@ -7,6 +7,11 @@ const JS_IMPORT_RE = /(?:^|\n)\s*import\s+(?:[\s\S]*?\s+from\s+)?['"](\.[^'"]+)[ const JS_EXPORT_FROM_RE = /(?:^|\n)\s*export\s+\*\s+from\s+['"](\.[^'"]+)['"]\s*;?/g; const JS_RELATIVE_IMPORT_STATEMENT_RE = /(^|\n)([ \t]*)import\s+([\s\S]*?)\s+from\s+['"](\.[^'"]+)['"]\s*;?[ \t]*/g; const IDENTIFIER_RE = /^[A-Za-z_$][\w$]*$/; +const VOID_HTML_TAGS = new Set([ + 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', + 'link', 'meta', 'param', 'source', 'track', 'wbr' +]); +const PRECOMPILED_RENDER_PATH = path.join(__dirname, 'res', 'web-ui-render.precompiled.js'); function stripBom(content) { return content.replace(/^\uFEFF/, ''); @@ -58,6 +63,69 @@ function bundleCssFile(filePath, stack = []) { }); } +function extractElementInnerHtmlById(html, id) { + const escapedId = String(id || '').replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const startRe = new RegExp(`<([A-Za-z][\\w:-]*)(?=[^>]*\\bid=["']${escapedId}["'])[^>]*>`, 'i'); + const startMatch = startRe.exec(html); + if (!startMatch) { + throw new Error(`Unable to find #${id} in bundled Web UI HTML`); + } + const tagName = startMatch[1].toLowerCase(); + const openEnd = startMatch.index + startMatch[0].length; + const tagRe = new RegExp(`]*>`, 'ig'); + tagRe.lastIndex = openEnd; + let depth = 1; + let match = tagRe.exec(html); + while (match) { + const rawTag = match[0]; + const isClosing = rawTag.startsWith('') || VOID_HTML_TAGS.has(tagName); + if (isClosing) { + depth -= 1; + } else if (!isSelfClosing) { + depth += 1; + } + if (depth === 0) { + return html.slice(openEnd, match.index); + } + match = tagRe.exec(html); + } + throw new Error(`Unable to find closing for #${id} in bundled Web UI HTML`); +} + +function compileWebUiTemplateToRenderScript(htmlPath = path.join(__dirname, 'index.html')) { + let compile; + try { + ({ compile } = require('@vue/compiler-dom')); + } catch (e) { + throw new Error(`Unable to compile Web UI template: @vue/compiler-dom is required (${e.message})`); + } + const html = bundleHtmlFile(htmlPath); + const appTemplate = extractElementInnerHtmlById(html, 'app'); + const result = compile(appTemplate, { mode: 'function', prefixIdentifiers: true }); + return [ + 'window.__CODEXMATE_WEB_UI_RENDER__ = (() => {', + result.code.trimEnd(), + '})();', + '' + ].join('\n'); +} + +function readPrecompiledWebUiRenderScript(entryPath = PRECOMPILED_RENDER_PATH) { + const resolvedPath = path.isAbsolute(entryPath) + ? entryPath + : path.resolve(__dirname, entryPath); + try { + const source = readUtf8Text(resolvedPath).trimEnd(); + return source ? `${source}\n` : ''; + } catch (error) { + if (error && error.code === 'ENOENT') { + return ''; + } + throw error; + } +} + function resolveJavaScriptDependencies(filePath) { const source = readUtf8Text(filePath); const dependencies = []; @@ -212,7 +280,8 @@ function readBundledWebUiScript(entryPath = path.join(__dirname, 'app.js')) { } function readExecutableBundledWebUiScript(entryPath = path.join(__dirname, 'app.js')) { - return bundleExecutableJavaScriptFile(entryPath, { preserveExports: false }); + const renderScript = readPrecompiledWebUiRenderScript() || compileWebUiTemplateToRenderScript(); + return `${renderScript}\n${bundleExecutableJavaScriptFile(entryPath, { preserveExports: false })}`; } function readExecutableBundledJavaScriptModule(entryPath) { @@ -224,6 +293,9 @@ function readExecutableBundledJavaScriptModule(entryPath) { module.exports = { collectJavaScriptFiles, + compileWebUiTemplateToRenderScript, + extractElementInnerHtmlById, + readPrecompiledWebUiRenderScript, readUtf8Text, readBundledWebUiHtml, readBundledWebUiCss, diff --git a/web-ui/styles/base-theme.css b/web-ui/styles/base-theme.css index 62b8c688..819f7cd9 100644 --- a/web-ui/styles/base-theme.css +++ b/web-ui/styles/base-theme.css @@ -26,6 +26,16 @@ --color-success: #4B8B6A; --color-error: #C44536; + /* Delta 指示色 */ + --color-delta-up: #4caf50; + --color-delta-down: #f44336; + + /* 热力图色阶 */ + --color-heatmap-1: rgba(200, 121, 99, 0.2); + --color-heatmap-2: rgba(200, 121, 99, 0.4); + --color-heatmap-3: rgba(200, 121, 99, 0.6); + --color-heatmap-4: rgba(200, 121, 99, 0.85); + --bg-warm-gradient: radial-gradient(circle at 14% 8%, rgba(255, 219, 196, 0.5) 0%, rgba(255, 219, 196, 0) 32%), radial-gradient(circle at 88% 0%, rgba(252, 239, 207, 0.58) 0%, rgba(252, 239, 207, 0) 30%), diff --git a/web-ui/styles/navigation-panels.css b/web-ui/styles/navigation-panels.css index 34d1ad67..e3da8bf7 100644 --- a/web-ui/styles/navigation-panels.css +++ b/web-ui/styles/navigation-panels.css @@ -38,10 +38,18 @@ margin: 0 0 12px; } +.status-strip-placeholder { + visibility: hidden; + pointer-events: none; + user-select: none; +} + /* Give the status strip a bit more breathing room under the sticky header. */ .main-panel-topbar .status-strip { margin-top: 10px; margin-bottom: 16px; + min-height: 36px; + align-items: center; } .lang-toggle { diff --git a/web-ui/styles/responsive.css b/web-ui/styles/responsive.css index 959f3cbc..d6885bb7 100644 --- a/web-ui/styles/responsive.css +++ b/web-ui/styles/responsive.css @@ -85,11 +85,21 @@ textarea:focus-visible { :root { --side-rail-width: min(188px, 46vw); } + + .container { + display: flex; + flex-direction: column; + height: 100vh; + min-height: 100vh; + overflow: hidden; + } + .app-shell { grid-template-columns: 1fr; - min-height: auto; + flex: 1 1 auto; + min-height: 0; height: auto; - overflow: visible; + overflow: hidden; } .side-rail { @@ -102,26 +112,34 @@ textarea:focus-visible { .top-tabs { display: flex !important; + flex: 0 0 auto; flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden; padding-bottom: 2px; margin-left: -2px; margin-right: -2px; + background: rgba(255, 248, 241, 0.96); + position: relative; + z-index: 30; } .main-panel { padding: 0 12px 16px; - height: auto; - overflow-y: visible; + height: 100%; + min-height: 0; + overflow-y: auto; + -webkit-overflow-scrolling: touch; } .main-panel-topbar { - position: static; + position: sticky; + top: 0; + z-index: 20; margin: 0 0 10px; - padding: 0; - background: transparent; - backdrop-filter: none; + padding: 0 0 8px; + background: rgba(255, 248, 241, 0.96); + backdrop-filter: blur(14px) saturate(130%); } .panel-header-refined { @@ -155,10 +173,29 @@ textarea:focus-visible { } .status-strip { - grid-template-columns: 1fr; gap: 12px; } + .main-panel-topbar .status-strip { + display: flex; + flex-wrap: nowrap; + gap: 8px; + overflow-x: auto; + overflow-y: hidden; + padding-bottom: 2px; + scrollbar-width: none; + -webkit-overflow-scrolling: touch; + } + + .main-panel-topbar .status-strip::-webkit-scrollbar { + display: none; + } + + .main-panel-topbar .status-chip { + flex: 0 0 auto; + min-width: max-content; + } + .market-grid { grid-template-columns: 1fr; } @@ -212,6 +249,10 @@ textarea:focus-visible { min-width: 100%; } + .main-panel-topbar .status-chip { + min-width: max-content; + } + .btn-add, .btn-tool, .card-action-btn, diff --git a/web-ui/styles/sessions-usage.css b/web-ui/styles/sessions-usage.css index 8ae22a9b..8807756c 100644 --- a/web-ui/styles/sessions-usage.css +++ b/web-ui/styles/sessions-usage.css @@ -1,5 +1,5 @@ /* ============================================ - Usage Tab — Refined Design System + Usage Tab — 时光之河设计 ============================================ */ /* ---- Toolbar ---- */ @@ -9,21 +9,21 @@ align-items: center; gap: 12px; flex-wrap: wrap; - margin-bottom: 18px; + margin-bottom: 20px; } .usage-toolbar-title { - font-size: var(--font-size-title); - font-weight: var(--font-weight-title); + font-size: 18px; + font-weight: 600; color: var(--color-text-primary); - letter-spacing: -0.01em; + letter-spacing: -0.02em; } .usage-range-group { display: flex; - gap: 4px; - padding: 3px; - border-radius: var(--radius-md); + gap: 3px; + padding: 4px; + border-radius: 10px; background: var(--color-surface-alt); border: 1px solid var(--color-border-soft); } @@ -32,14 +32,14 @@ border: none; background: transparent; color: var(--color-text-tertiary); - padding: 5px 11px; - border-radius: var(--radius-sm); + padding: 6px 14px; + border-radius: 7px; cursor: pointer; - font-size: 12px; - font-weight: 600; + font-size: 13px; + font-weight: 500; font-family: var(--font-family); white-space: nowrap; - transition: all 120ms var(--ease-spring); + transition: all 150ms var(--ease-spring); outline: none; -webkit-tap-highlight-color: transparent; } @@ -50,13 +50,13 @@ } .usage-range-btn:active:not(:disabled) { - transform: scale(0.97); + transform: scale(0.96); } .usage-range-btn.active { color: #fff; background: var(--color-brand); - box-shadow: 0 1px 3px rgba(200, 121, 99, 0.35); + box-shadow: 0 2px 8px rgba(200, 121, 99, 0.3); } .usage-range-btn:disabled { @@ -65,34 +65,75 @@ } .usage-range-btn-icon { - padding: 5px 8px; + padding: 6px 10px; display: inline-flex; align-items: center; justify-content: center; } .usage-range-btn-icon svg { - width: 14px; - height: 14px; + width: 15px; + height: 15px; } -/* ---- Current session bar ---- */ -.usage-current-session-bar { +/* ---- Empty State (插画风格) ---- */ +.usage-empty-state { display: flex; - flex-wrap: wrap; + flex-direction: column; align-items: center; - gap: 10px; - padding: 8px 14px; + justify-content: center; + padding: 48px 20px; + text-align: center; +} + +.usage-empty-illustration { + width: 64px; + height: 64px; + color: var(--color-text-muted); + opacity: 0.6; margin-bottom: 16px; - border-radius: var(--radius-md); + animation: usage-empty-breathe 3s ease-in-out infinite; +} + +@keyframes usage-empty-breathe { + 0%, 100% { transform: scale(1); opacity: 0.5; } + 50% { transform: scale(1.05); opacity: 0.7; } +} + +.usage-empty-text { + font-size: 13px; + color: var(--color-text-secondary); + max-width: 280px; +} + +/* ---- Hero 区域 ---- */ +.usage-hero { + padding: 24px; + margin-bottom: 20px; + border-radius: 14px; + background: var(--color-surface); + border: 1px solid var(--color-border-soft); + min-height: 140px; + display: flex; + flex-direction: column; + justify-content: center; + gap: 16px; +} + +.usage-hero-active { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 8px 12px; + padding: 10px 16px; + border-radius: 10px; background: var(--color-surface-alt); font-size: 12px; - color: var(--color-text-secondary); } -.usage-current-session-dot { - width: 7px; - height: 7px; +.usage-hero-active-dot { + width: 6px; + height: 6px; border-radius: 50%; background: var(--color-success); flex-shrink: 0; @@ -100,258 +141,136 @@ } @keyframes usage-pulse { - 0%, 100% { opacity: 1; } - 50% { opacity: 0.4; } + 0%, 100% { opacity: 1; transform: scale(1); } + 50% { opacity: 0.4; transform: scale(0.9); } } -.usage-current-session-label { - font-weight: 700; +.usage-hero-active-label { + font-weight: 600; color: var(--color-text-primary); } -.usage-current-session-stat { +.usage-hero-active-stat { color: var(--color-text-tertiary); } -.usage-current-session-stat::before { +.usage-hero-active-stat::before { content: '·'; margin-right: 10px; color: var(--color-border-strong); } -/* ---- Summary cards ---- */ -.usage-summary-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); - gap: 10px; - margin-bottom: 18px; -} - -.usage-summary-card { - display: flex; - flex-direction: column; - justify-content: center; - gap: 2px; - padding: 14px 16px; - border-radius: var(--radius-md); - background: var(--color-surface); - border: 1px solid var(--color-border-soft); - transition: all 120ms var(--ease-spring); - min-height: 72px; +.usage-hero-metrics { + text-align: center; } -.usage-summary-card-value { - font-size: 26px; +.usage-hero-main { + font-size: 42px; font-weight: 700; color: var(--color-text-primary); - line-height: 1.1; - letter-spacing: -0.02em; + line-height: 1; + letter-spacing: -0.03em; font-variant-numeric: tabular-nums; + animation: usage-hero-count 0.8s ease-out; } -.usage-summary-card-label { - font-size: 11px; - font-weight: 500; - color: var(--color-text-tertiary); - text-transform: uppercase; - letter-spacing: 0.04em; -} - -.usage-copyable { - cursor: pointer; - -webkit-tap-highlight-color: transparent; -} - -.usage-copyable:hover { - border-color: var(--color-brand); - background: var(--color-surface-alt); -} - -.usage-copyable:active { - transform: scale(0.98); -} - -.usage-copyable:focus-visible { - outline: 2px solid var(--color-brand-light); - outline-offset: 2px; -} - -/* ---- Content area ---- */ -.usage-content { - position: relative; -} - -.usage-content-loading { - opacity: 0.7; - pointer-events: none; +@keyframes usage-hero-count { + from { opacity: 0; transform: translateY(10px); } + to { opacity: 1; transform: translateY(0); } } -.usage-content-overlay { - position: absolute; - inset: 0; +.usage-hero-sub { + margin-top: 8px; + font-size: 13px; + color: var(--color-text-tertiary); display: flex; - align-items: flex-start; - justify-content: flex-end; - padding: 12px; - z-index: 1; -} - -.usage-spinner { - width: 16px; - height: 16px; - border-radius: 50%; - border: 2px solid var(--color-border-soft); - border-top-color: var(--color-brand); - animation: usage-spin 0.8s linear infinite; -} - -@keyframes usage-spin { - to { transform: rotate(360deg); } -} - -/* ---- Cards ---- */ -.usage-card { - padding: 18px; - border-radius: var(--radius-md); - background: var(--color-surface); - border: 1px solid var(--color-border-soft); - margin-bottom: 12px; -} - -.usage-card-head { - margin-bottom: 14px; -} - -.usage-card-title { - font-size: 14px; - font-weight: 700; - color: var(--color-text-primary); - margin-bottom: 2px; -} - -.usage-card-subtitle { - font-size: 11px; - color: var(--color-text-muted); -} - -/* ---- Chart grid ---- */ -.usage-chart-grid { - display: grid; - grid-template-columns: repeat(2, 1fr); + align-items: center; + justify-content: center; gap: 12px; + flex-wrap: wrap; } -.usage-card-wide { - grid-column: 1 / -1; +.usage-hero-delta { + font-size: 12px; + font-weight: 600; + padding: 2px 8px; + border-radius: 12px; } -/* ---- Daily chart ---- */ -.usage-daily-chart { - display: flex; - align-items: flex-end; - gap: 4px; - height: 140px; - padding: 0 2px; +.usage-hero-delta.delta-up { + color: var(--color-delta-up); + background: rgba(76, 175, 80, 0.12); } -.usage-daily-bar-group { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - gap: 6px; - cursor: pointer; - min-width: 0; - -webkit-tap-highlight-color: transparent; +.usage-hero-delta.delta-down { + color: var(--color-delta-down); + background: rgba(244, 67, 54, 0.12); } -.usage-daily-bar-stack { - width: 100%; - max-width: 32px; - height: 100px; - display: flex; - flex-direction: column; - justify-content: flex-end; - position: relative; - border-radius: 4px 4px 0 0; +/* ---- 波浪图 ---- */ +.usage-wave-section { overflow: hidden; - background: var(--color-surface-alt); } -.usage-daily-bar-fill { - width: 100%; - border-radius: 4px 4px 0 0; - background: var(--color-brand); - transition: height 200ms var(--ease-spring); - min-height: 2px; +.usage-wave-container { + margin-top: 12px; + position: relative; } -.usage-daily-bar-prev { +.usage-wave-chart { width: 100%; - background: var(--color-text-muted); - opacity: 0.35; - border-radius: 4px 4px 0 0; + height: 140px; + display: block; } -.usage-daily-bar-group.active .usage-daily-bar-fill { - background: var(--color-brand-dark); - box-shadow: 0 0 8px rgba(200, 121, 99, 0.3); +.usage-wave-area { + transition: d 0.4s var(--ease-spring); } -.usage-daily-bar-group:hover .usage-daily-bar-fill { - filter: brightness(1.1); +.usage-wave-line { + transition: d 0.4s var(--ease-spring); } -.usage-daily-bar-label { - font-size: 10px; - color: var(--color-text-muted); - text-align: center; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 100%; +.usage-wave-hover-line { + transition: x1 0.2s, x2 0.2s, y1 0.2s, y2 0.2s; } -.usage-daily-bar-group.active .usage-daily-bar-label { - color: var(--color-brand-dark); - font-weight: 700; +.usage-wave-hover-point { + transition: cx 0.2s, cy 0.2s; } -/* ---- Daily legend ---- */ -.usage-daily-legend { +.usage-wave-labels { display: flex; - gap: 16px; - margin-top: 10px; - font-size: 11px; - color: var(--color-text-muted); -} - -.usage-daily-legend-item { - display: inline-flex; - align-items: center; - gap: 5px; + justify-content: space-between; + margin-top: 8px; + padding: 0 4px; } -.usage-daily-legend-swatch { - width: 10px; - height: 10px; - border-radius: 2px; +.usage-wave-label { + font-size: 10px; + color: var(--color-text-muted); + cursor: pointer; + padding: 2px 6px; + border-radius: 4px; + transition: all 0.15s ease-out; + -webkit-tap-highlight-color: transparent; } -.usage-daily-legend-swatch.current { - background: var(--color-brand); +.usage-wave-label:hover { + color: var(--color-text-secondary); + background: var(--color-surface-alt); } -.usage-daily-legend-swatch.prev { - background: var(--color-text-muted); - opacity: 0.35; +.usage-wave-label.active { + color: var(--color-brand); + font-weight: 600; } -/* ---- Day detail ---- */ +/* ---- 日期详情 ---- */ .usage-daydetail { - margin-top: 12px; - padding: 10px 14px; - border-radius: var(--radius-sm); + margin-top: 16px; + padding: 12px 16px; + border-radius: 10px; background: var(--color-surface-alt); } @@ -364,7 +283,7 @@ } .usage-daydetail-date { - font-weight: 700; + font-weight: 600; font-size: 13px; color: var(--color-text-primary); } @@ -380,82 +299,7 @@ color: var(--color-text-muted); } -/* ---- Lists ---- */ -.usage-list { - display: flex; - flex-direction: column; - gap: 8px; -} - -.usage-list-row { - display: grid; - grid-template-columns: 1fr auto; - align-items: center; - gap: 8px 12px; - padding: 8px 10px; - border-radius: var(--radius-sm); - background: var(--color-surface-alt); - transition: background 120ms var(--ease-spring); -} - -.usage-list-row:hover { - background: var(--color-surface-elevated); -} - -.usage-list-title { - font-size: 12px; - font-weight: 600; - color: var(--color-text-primary); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.usage-list-path { - font-size: 12px; - color: var(--color-text-secondary); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-family: var(--font-family-mono); - font-size: 11px; -} - -.usage-list-stat { - font-size: 13px; - font-weight: 700; - color: var(--color-text-primary); - font-variant-numeric: tabular-nums; - text-align: right; -} - -.usage-list-meta { - grid-column: 1 / -1; - font-size: 11px; - color: var(--color-text-muted); -} - -.usage-list-value { - font-size: 12px; - color: var(--color-text-secondary); - padding: 8px 0; -} - -.usage-progress { - height: 3px; - border-radius: 2px; - background: var(--color-surface-alt); - overflow: hidden; -} - -.usage-progress-fill { - height: 100%; - border-radius: 2px; - background: var(--color-brand); - transition: width 300ms var(--ease-spring); -} - -/* ---- Hourly heatmap ---- */ +/* ---- 热力图 ---- */ .usage-card-hourly-heatmap { overflow-x: auto; } @@ -506,8 +350,9 @@ .hourly-heatmap-cell { flex: 1; min-width: 0; - aspect-ratio: 1; + height: 6px; border-radius: 3px; + transition: background 0.15s ease-out; } .hourly-heatmap-cell.level-0 { background: var(--color-surface-alt); } @@ -521,7 +366,7 @@ align-items: center; gap: 3px; justify-content: flex-end; - margin-top: 8px; + margin-top: 10px; font-size: 10px; color: var(--color-text-muted); } @@ -529,32 +374,199 @@ .hourly-heatmap-legend .hourly-heatmap-cell { width: 11px; height: 11px; - aspect-ratio: auto; } .hourly-heatmap-legend-label { margin: 0 2px; } -/* ---- Empty state ---- */ -.usage-empty { - padding: 32px 16px; - border-radius: var(--radius-md); +/* ---- 列表样式 ---- */ +.usage-list-compact { + display: flex; + flex-direction: column; + gap: 4px; +} + +.usage-list-compact-item { + display: flex; + align-items: flex-start; + gap: 8px; + padding: 8px 10px; + border-radius: 8px; + cursor: pointer; + transition: all 0.15s ease-out; + -webkit-tap-highlight-color: transparent; +} + +.usage-list-compact-item:hover { + background: var(--color-surface-elevated); +} + +.usage-list-compact-item:active { + transform: scale(0.98); +} + +.usage-list-bullet { + color: var(--color-brand); + font-size: 14px; + line-height: 1.4; + flex-shrink: 0; +} + +.usage-list-compact-content { + flex: 1; + min-width: 0; +} + +.usage-list-title { + font-size: 12px; + font-weight: 500; + color: var(--color-text-primary); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.usage-list-meta { + font-size: 11px; + color: var(--color-text-muted); + margin-top: 2px; +} + +.usage-list-value { + font-size: 12px; + color: var(--color-text-secondary); + padding: 8px 0; +} + +/* ---- Path 列表 ---- */ +.usage-paths-section { + grid-column: 1 / -1; +} + +.usage-list-paths { + display: flex; + flex-direction: column; + gap: 6px; +} + +.usage-list-path-row { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 10px; + border-radius: 8px; + transition: background 0.15s ease-out; +} + +.usage-list-path-row:hover { background: var(--color-surface-alt); - border: 1px dashed var(--color-border); +} + +.usage-list-path-rank { + width: 18px; + height: 18px; + display: flex; + align-items: center; + justify-content: center; + font-size: 10px; + font-weight: 600; + color: var(--color-brand); + background: var(--color-surface-alt); + border-radius: 4px; + flex-shrink: 0; +} + +.usage-list-path-content { + flex: 1; + display: flex; + justify-content: space-between; + align-items: center; + gap: 10px; + min-width: 0; +} + +.usage-list-path { + font-size: 12px; color: var(--color-text-secondary); - text-align: center; + font-family: var(--font-family-mono); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.usage-list-path-stat { font-size: 13px; + font-weight: 600; + color: var(--color-text-primary); + font-variant-numeric: tabular-nums; + flex-shrink: 0; } -/* ---- Responsive ---- */ +/* ---- 卡片 ---- */ +.usage-card { + padding: 20px; + border-radius: 14px; + background: var(--color-surface); + border: 1px solid var(--color-border-soft); + margin-bottom: 0; +} + +.usage-card-title { + font-size: 14px; + font-weight: 600; + color: var(--color-text-primary); + margin-bottom: 4px; +} + +/* ---- 图表网格 ---- */ +.usage-chart-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 12px; +} + +/* ---- 内容区域 ---- */ +.usage-content { + position: relative; +} + +.usage-content-loading { + opacity: 0.7; + pointer-events: none; +} + +.usage-content-overlay { + position: absolute; + inset: 0; + display: flex; + align-items: flex-start; + justify-content: flex-end; + padding: 12px; + z-index: 1; +} + +.usage-spinner { + width: 16px; + height: 16px; + border-radius: 50%; + border: 2px solid var(--color-border-soft); + border-top-color: var(--color-brand); + animation: usage-spin 0.8s linear infinite; +} + +@keyframes usage-spin { + to { transform: rotate(360deg); } +} + +/* ---- 响应式 ---- */ @media (max-width: 960px) { .usage-chart-grid { grid-template-columns: 1fr; } - .usage-summary-grid { - grid-template-columns: repeat(2, 1fr); + .usage-hero-main { + font-size: 36px; } } @@ -569,20 +581,25 @@ flex-wrap: wrap; } - .usage-summary-grid { - grid-template-columns: repeat(2, 1fr); + .usage-hero { + padding: 20px; + min-height: 120px; } - .usage-summary-card-value { - font-size: 22px; + .usage-hero-main { + font-size: 32px; } - .usage-daily-chart { + .usage-wave-chart { height: 100px; } - .usage-daily-bar-stack { - max-width: 24px; - height: 70px; + .usage-wave-labels { + font-size: 9px; + } + + .hourly-heatmap-wrapper { + min-width: 100%; + overflow-x: auto; } } diff --git a/web-ui/styles/skills-market.css b/web-ui/styles/skills-market.css index 3e8dd9d7..9851f469 100644 --- a/web-ui/styles/skills-market.css +++ b/web-ui/styles/skills-market.css @@ -1,3 +1,297 @@ +/* ========================= + Minimalist Skills Flow Layout + ========================= */ + +/* Header with title and target switch */ +.skills-minimal-header { + display: flex; + justify-content: space-between; + align-items: center; + gap: var(--spacing-sm); + margin-bottom: var(--spacing-md); + padding-bottom: var(--spacing-sm); + border-bottom: 1px solid var(--color-border-soft); +} + +.skills-header-left { + display: flex; + flex-direction: column; + gap: 10px; +} + +.skills-header-title { + font-size: 20px; + font-weight: var(--font-weight-primary); + color: var(--color-text-primary); + letter-spacing: -0.01em; +} + +.skills-target-switch { + display: inline-flex; + background: var(--color-surface-alt); + border-radius: var(--radius-full); + padding: 3px; + gap: 3px; +} + +.skills-target-chip { + border: none; + background: transparent; + color: var(--color-text-secondary); + padding: 6px 14px; + font-size: var(--font-size-caption); + font-weight: var(--font-weight-caption); + border-radius: var(--radius-full); + cursor: pointer; + transition: all var(--transition-fast) var(--ease-smooth); +} + +.skills-target-chip:disabled, +.skills-target-chip[disabled] { + cursor: not-allowed; + opacity: 0.5; + pointer-events: none; +} + +.skills-target-chip.active { + background: var(--color-surface); + color: var(--color-text-primary); + box-shadow: 0 1px 3px rgba(0,0,0,0.06); +} + +.skills-target-chip:hover:not(.active):not(:disabled) { + color: var(--color-text-primary); +} + +.skills-header-actions { + display: flex; + gap: 6px; +} + +/* Flow panels */ +.skills-flow-panel { + margin-bottom: var(--spacing-md); + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + overflow: hidden; +} + +.skills-flow-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--spacing-sm) var(--spacing-md); + border-bottom: 1px solid var(--color-border-soft); + background: linear-gradient(to bottom, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%); +} + +.skills-flow-title-wrap { + display: flex; + align-items: baseline; + gap: 8px; +} + +.skills-flow-title { + font-size: var(--font-size-body); + font-weight: var(--font-weight-secondary); + color: var(--color-text-secondary); +} + +.skills-flow-count { + font-size: var(--font-size-caption); + color: var(--color-text-tertiary); + background: var(--color-surface-alt); + padding: 2px 8px; + border-radius: var(--radius-full); + font-weight: var(--font-weight-caption); +} + +/* Flow list */ +.skills-flow-list { + display: flex; + flex-direction: column; +} + +.skills-flow-item { + display: flex; + justify-content: space-between; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm) var(--spacing-md); + border-bottom: 1px solid var(--color-border-soft); + transition: background var(--transition-fast) var(--ease-smooth); + min-height: 56px; +} + +.skills-flow-item:last-child { + border-bottom: none; +} + +.skills-flow-item:hover { + background: rgba(255,255,255,0.4); +} + +.skills-flow-item.has-issue { + background: rgba(255,243,236,0.3); +} + +.skills-flow-item.has-issue:hover { + background: rgba(255,243,236,0.5); +} + +.skills-flow-main { + display: flex; + flex-direction: column; + gap: 3px; + min-width: 0; + flex: 1; +} + +.skills-flow-name { + font-size: var(--font-size-body); + font-weight: var(--font-weight-secondary); + color: var(--color-text-primary); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.skills-flow-path, +.skills-flow-meta { + font-size: var(--font-size-caption); + color: var(--color-text-tertiary); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.skills-flow-status { + font-size: var(--font-size-caption); + padding: 4px 10px; + border-radius: var(--radius-full); + font-weight: var(--font-weight-caption); + white-space: nowrap; +} + +.skills-flow-status.success { + background: rgba(52,168,83,0.1); + color: rgba(52,168,83,0.9); +} + +.skills-flow-status.warning { + background: rgba(255,159,10,0.1); + color: rgba(255,159,10,0.9); +} + +.skills-flow-add { + border: none; + background: var(--color-surface-alt); + color: var(--color-text-secondary); + width: 36px; + height: 36px; + border-radius: var(--radius-full); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all var(--transition-fast) var(--ease-smooth); + flex-shrink: 0; +} + +.skills-flow-add:hover:not(:disabled) { + background: var(--color-brand); + color: white; +} + +.skills-flow-add:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +/* Quick actions in import panel */ +.skills-flow-actions { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--spacing-xs); + padding: var(--spacing-sm) var(--spacing-md); + border-bottom: 1px solid var(--color-border-soft); + background: rgba(255,255,255,0.3); +} + +.skills-action-btn { + border: 1px solid var(--color-border); + background: var(--color-surface); + color: var(--color-text-secondary); + padding: 10px 14px; + border-radius: var(--radius-md); + font-size: var(--font-size-caption); + font-weight: var(--font-weight-caption); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + transition: all var(--transition-fast) var(--ease-smooth); +} + +.skills-action-btn:hover:not(:disabled) { + border-color: var(--color-brand); + background: rgba(255,243,236,0.5); + color: var(--color-brand-dark); +} + +.skills-action-btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +/* Loading and empty states */ +.skills-flow-loading, +.skills-flow-empty { + padding: var(--spacing-md); + text-align: center; + color: var(--color-text-tertiary); + font-size: var(--font-size-caption); +} + +/* Spinning icon */ +@keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +.spin { + animation: spin 0.8s linear infinite; +} + +/* Responsive */ +@media (max-width: 600px) { + .skills-minimal-header { + flex-direction: column; + align-items: flex-start; + gap: var(--spacing-sm); + } + + .skills-header-actions { + align-self: flex-end; + } + + .skills-flow-actions { + grid-template-columns: 1fr; + } + + .skills-flow-item { + flex-wrap: wrap; + } + + .skills-flow-status, + .skills-flow-add { + margin-left: auto; + } +} + +/* Legacy styles for modal (preserved) */ .agent-list { display: flex; flex-direction: column; diff --git a/web-ui/styles/titles-cards.css b/web-ui/styles/titles-cards.css index 53dd2b1d..e28ded76 100644 --- a/web-ui/styles/titles-cards.css +++ b/web-ui/styles/titles-cards.css @@ -154,6 +154,20 @@ background: var(--color-brand); } +.card.disabled { + opacity: 0.5; + pointer-events: none; + cursor: not-allowed; +} + +.card.disabled:hover { + transform: none; +} + +.card.disabled::after { + opacity: 0; +} + .card:hover::after { opacity: 0.6; }