From 3410aec605c5493b549a677a36bb73fdda65cb6f Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 23 May 2025 10:13:36 +0200 Subject: [PATCH 01/67] spot: close offscreen doc before reinit --- spot/entrypoints/background.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/spot/entrypoints/background.ts b/spot/entrypoints/background.ts index b393ca570..8dbc6e8bf 100644 --- a/spot/entrypoints/background.ts +++ b/spot/entrypoints/background.ts @@ -965,13 +965,11 @@ export default defineBackground(() => { (c: { contextType: string }) => c.contextType === "OFFSCREEN_DOCUMENT", ); if (offscreenDocument) { - return; - // TODO: check manifestv3 for reloading context - // try { - // await browser.offscreen.closeDocument(); - // } catch (e) { - // console.trace(e) - // } + try { + await browser.offscreen.closeDocument(); + } catch (e) { + console.error("Spot: error closing old offscreen document", e); + } } try { From 52a208024db19cefda7befcf2872c4eae95aae3b Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 23 May 2025 11:08:48 +0200 Subject: [PATCH 02/67] spot: upgrade wxt, properly reset offscreen page --- spot/assets/main.css | 7 +- spot/bun.lock | 1500 +++++++++++++++++ spot/bun.lockb | Bin 274253 -> 0 bytes .../entrypoints/content/RecordingControls.tsx | 10 +- spot/entrypoints/content/index.tsx | 1 + spot/entrypoints/content/style.css | 6 - spot/package.json | 12 +- spot/postcss.config.js | 2 +- spot/wxt.config.ts | 10 +- 9 files changed, 1526 insertions(+), 22 deletions(-) create mode 100644 spot/bun.lock delete mode 100755 spot/bun.lockb diff --git a/spot/assets/main.css b/spot/assets/main.css index bd6213e1d..7184c49c7 100644 --- a/spot/assets/main.css +++ b/spot/assets/main.css @@ -1,3 +1,4 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; \ No newline at end of file +@import "tailwindcss"; +@plugin "daisyui" { + themes: light --default; +} diff --git a/spot/bun.lock b/spot/bun.lock new file mode 100644 index 000000000..3b5080844 --- /dev/null +++ b/spot/bun.lock @@ -0,0 +1,1500 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "wxt-starter", + "dependencies": { + "@neodrag/solid": "^2.3.0", + "@openreplay/network-proxy": "^1.1.0", + "@tailwindcss/postcss": "^4.1.7", + "@tailwindcss/vite": "^4.1.7", + "@thedutchcoder/postcss-rem-to-px": "^0.0.2", + "autoprefixer": "^10.4.21", + "postcss": "^8.5.3", + "prettier": "^3.5.3", + "solid-js": "^1.9.7", + "tailwindcss": "4.1.7", + "web-vitals": "^4.2.4", + }, + "devDependencies": { + "@wxt-dev/module-solid": "^1.1.3", + "daisyui": "5.0.37", + "typescript": "^5.8.2", + "wxt": "0.20.6", + }, + }, + }, + "packages": { + "@1natsu/wait-element": ["@1natsu/wait-element@4.1.2", "", { "dependencies": { "defu": "^6.1.4", "many-keys-map": "^2.0.1" } }, "sha512-qWxSJD+Q5b8bKOvESFifvfZ92DuMsY+03SBNjTO34ipJLP6mZ9yK4bQz/vlh48aEQXoJfaZBqUwKL5BdI5iiWw=="], + + "@aklinker1/rollup-plugin-visualizer": ["@aklinker1/rollup-plugin-visualizer@5.12.0", "", { "dependencies": { "open": "^8.4.0", "picomatch": "^2.3.1", "source-map": "^0.7.4", "yargs": "^17.5.1" }, "peerDependencies": { "rollup": "2.x || 3.x || 4.x" }, "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" } }, "sha512-X24LvEGw6UFmy0lpGJDmXsMyBD58XmX1bbwsaMLhNoM+UMQfQ3b2RtC+nz4b/NoRK5r6QJSKJHBNVeUdwqybaQ=="], + + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@babel/code-frame": ["@babel/code-frame@7.24.7", "", { "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" } }, "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA=="], + + "@babel/compat-data": ["@babel/compat-data@7.25.4", "", {}, "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ=="], + + "@babel/core": ["@babel/core@7.25.2", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.25.0", "@babel/helper-compilation-targets": "^7.25.2", "@babel/helper-module-transforms": "^7.25.2", "@babel/helpers": "^7.25.0", "@babel/parser": "^7.25.0", "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.2", "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA=="], + + "@babel/generator": ["@babel/generator@7.25.5", "", { "dependencies": { "@babel/types": "^7.25.4", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" } }, "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.25.2", "", { "dependencies": { "@babel/compat-data": "^7.25.2", "@babel/helper-validator-option": "^7.24.8", "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.24.7", "", { "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" } }, "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.25.2", "", { "dependencies": { "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", "@babel/helper-validator-identifier": "^7.24.7", "@babel/traverse": "^7.25.2" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.24.8", "", {}, "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg=="], + + "@babel/helper-simple-access": ["@babel/helper-simple-access@7.24.7", "", { "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" } }, "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.24.8", "", {}, "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.24.7", "", {}, "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.24.8", "", {}, "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q=="], + + "@babel/helpers": ["@babel/helpers@7.25.0", "", { "dependencies": { "@babel/template": "^7.25.0", "@babel/types": "^7.25.0" } }, "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw=="], + + "@babel/highlight": ["@babel/highlight@7.24.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw=="], + + "@babel/parser": ["@babel/parser@7.25.4", "", { "dependencies": { "@babel/types": "^7.25.4" }, "bin": { "parser": "bin/babel-parser.js" } }, "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.24.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ=="], + + "@babel/runtime": ["@babel/runtime@7.27.0", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw=="], + + "@babel/template": ["@babel/template@7.25.0", "", { "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/parser": "^7.25.0", "@babel/types": "^7.25.0" } }, "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q=="], + + "@babel/traverse": ["@babel/traverse@7.25.4", "", { "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.25.4", "@babel/parser": "^7.25.4", "@babel/template": "^7.25.0", "@babel/types": "^7.25.4", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg=="], + + "@babel/types": ["@babel/types@7.25.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" } }, "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ=="], + + "@devicefarmer/adbkit": ["@devicefarmer/adbkit@3.3.8", "", { "dependencies": { "@devicefarmer/adbkit-logcat": "^2.1.2", "@devicefarmer/adbkit-monkey": "~1.2.1", "bluebird": "~3.7", "commander": "^9.1.0", "debug": "~4.3.1", "node-forge": "^1.3.1", "split": "~1.0.1" }, "bin": { "adbkit": "bin/adbkit" } }, "sha512-7rBLLzWQnBwutH2WZ0EWUkQdihqrnLYCUMaB44hSol9e0/cdIhuNFcqZO0xNheAU6qqHVA8sMiLofkYTgb+lmw=="], + + "@devicefarmer/adbkit-logcat": ["@devicefarmer/adbkit-logcat@2.1.3", "", {}, "sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw=="], + + "@devicefarmer/adbkit-monkey": ["@devicefarmer/adbkit-monkey@1.2.1", "", {}, "sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.5", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@neodrag/solid": ["@neodrag/solid@2.3.0", "", { "peerDependencies": { "solid-js": "^1.0.0" } }, "sha512-j6EAqCx3NbFNv3NiutPLudLmYBfcRGZoezAvODwwmMtEl4BR+i3n5PhxQCbc5rsw8Zf6AoOW7TJ3onah291v8w=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@openreplay/network-proxy": ["@openreplay/network-proxy@1.1.3", "", {}, "sha512-0w25xSK8Cr3y9trQKCEa7PQb2cf8m0nFbkqoxAKoyYCZTdE/e0pQ1ufcJaxzW/nYn4PVMDMmPnXcMOurCNnhvg=="], + + "@pnpm/config.env-replace": ["@pnpm/config.env-replace@1.1.0", "", {}, "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w=="], + + "@pnpm/network.ca-file": ["@pnpm/network.ca-file@1.0.2", "", { "dependencies": { "graceful-fs": "4.2.10" } }, "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA=="], + + "@pnpm/npm-conf": ["@pnpm/npm-conf@2.3.1", "", { "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", "config-chain": "^1.1.11" } }, "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.21.0", "", { "os": "android", "cpu": "arm" }, "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.21.0", "", { "os": "android", "cpu": "arm64" }, "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.21.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.21.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.41.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.41.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.21.0", "", { "os": "linux", "cpu": "arm" }, "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.21.0", "", { "os": "linux", "cpu": "arm" }, "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.21.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.21.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.41.0", "", { "os": "linux", "cpu": "none" }, "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.21.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.21.0", "", { "os": "linux", "cpu": "none" }, "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.41.0", "", { "os": "linux", "cpu": "none" }, "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.21.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.21.0", "", { "os": "linux", "cpu": "x64" }, "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.21.0", "", { "os": "linux", "cpu": "x64" }, "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.21.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.21.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.21.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.7", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.7" } }, "sha512-9rsOpdY9idRI2NH6CL4wORFY0+Q6fnx9XP9Ju+iq/0wJwGD5IByIgFmwVbyy4ymuyprj8Qh4ErxMKTUL4uNh3g=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.7", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.7", "@tailwindcss/oxide-darwin-arm64": "4.1.7", "@tailwindcss/oxide-darwin-x64": "4.1.7", "@tailwindcss/oxide-freebsd-x64": "4.1.7", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.7", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.7", "@tailwindcss/oxide-linux-arm64-musl": "4.1.7", "@tailwindcss/oxide-linux-x64-gnu": "4.1.7", "@tailwindcss/oxide-linux-x64-musl": "4.1.7", "@tailwindcss/oxide-wasm32-wasi": "4.1.7", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.7", "@tailwindcss/oxide-win32-x64-msvc": "4.1.7" } }, "sha512-5SF95Ctm9DFiUyjUPnDGkoKItPX/k+xifcQhcqX5RA85m50jw1pT/KzjdvlqxRja45Y52nR4MR9fD1JYd7f8NQ=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.7", "", { "os": "android", "cpu": "arm64" }, "sha512-IWA410JZ8fF7kACus6BrUwY2Z1t1hm0+ZWNEzykKmMNM09wQooOcN/VXr0p/WJdtHZ90PvJf2AIBS/Ceqx1emg=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-81jUw9To7fimGGkuJ2W5h3/oGonTOZKZ8C2ghm/TTxbwvfSiFSDPd6/A/KE2N7Jp4mv3Ps9OFqg2fEKgZFfsvg=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-q77rWjEyGHV4PdDBtrzO0tgBBPlQWKY7wZK0cUok/HaGgbNKecegNxCGikuPJn5wFAlIywC3v+WMBt0PEBtwGw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-RfmdbbK6G6ptgF4qqbzoxmH+PKfP4KSVs7SRlTwcbRgBwezJkAO3Qta/7gDy10Q2DcUVkKxFLXUQO6J3CRvBGw=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.7", "", { "os": "linux", "cpu": "arm" }, "sha512-OZqsGvpwOa13lVd1z6JVwQXadEobmesxQ4AxhrwRiPuE04quvZHWn/LnihMg7/XkN+dTioXp/VMu/p6A5eZP3g=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-voMvBTnJSfKecJxGkoeAyW/2XRToLZ227LxswLAwKY7YslG/Xkw9/tJNH+3IVh5bdYzYE7DfiaPbRkSHFxY1xA=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-PjGuNNmJeKHnP58M7XyjJyla8LPo+RmwHQpBI+W/OxqrwojyuCQ+GUtygu7jUqTEexejZHr/z3nBc/gTiXBj4A=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.7", "", { "os": "linux", "cpu": "x64" }, "sha512-HMs+Va+ZR3gC3mLZE00gXxtBo3JoSQxtu9lobbZd+DmfkIxR54NO7Z+UQNPsa0P/ITn1TevtFxXTpsRU7qEvWg=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.7", "", { "os": "linux", "cpu": "x64" }, "sha512-MHZ6jyNlutdHH8rd+YTdr3QbXrHXqwIhHw9e7yXEBcQdluGwhpQY2Eku8UZK6ReLaWtQ4gijIv5QoM5eE+qlsA=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.7", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.9", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-ANaSKt74ZRzE2TvJmUcbFQ8zS201cIPxUDm5qez5rLEwWkie2SkGtA4P+GPTj+u8N6JbPrC8MtY8RmJA35Oo+A=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-HUiSiXQ9gLJBAPCMVRk2RT1ZrBjto7WvqsPBwUrNK2BcdSxMnk19h4pjZjI7zgPhDxlAbJSumTC4ljeA9y0tEw=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.7", "", { "os": "win32", "cpu": "x64" }, "sha512-rYHGmvoHiLJ8hWucSfSOEmdCBIGZIq7SpkPRSqLsH2Ab2YUNgKeAPT1Fi2cx3+hnYOrAb0jp9cRyode3bBW4mQ=="], + + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.7", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.7", "@tailwindcss/oxide": "4.1.7", "postcss": "^8.4.41", "tailwindcss": "4.1.7" } }, "sha512-88g3qmNZn7jDgrrcp3ZXEQfp9CVox7xjP1HN2TFKI03CltPVd/c61ydn5qJJL8FYunn0OqBaW5HNUga0kmPVvw=="], + + "@tailwindcss/vite": ["@tailwindcss/vite@4.1.7", "", { "dependencies": { "@tailwindcss/node": "4.1.7", "@tailwindcss/oxide": "4.1.7", "tailwindcss": "4.1.7" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-tYa2fO3zDe41I7WqijyVbRd8oWT0aEID1Eokz5hMT6wShLIHj3yvwj9XbfuloHP9glZ6H+aG2AN/+ZrxJ1Y5RQ=="], + + "@thedutchcoder/postcss-rem-to-px": ["@thedutchcoder/postcss-rem-to-px@0.0.2", "", { "peerDependencies": { "postcss": "^8.3.0" } }, "sha512-M2T3bJSTgLtZF8+KDYDtSDAFGuTlaxYfitpjkmNswnfJ8AjbQ/g7NC+bqgAAViYWFV9I3tdrQuQ3Bu8j7GrjwA=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.6.8", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.20.6", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg=="], + + "@types/estree": ["@types/estree@1.0.5", "", {}, "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="], + + "@types/filesystem": ["@types/filesystem@0.0.36", "", { "dependencies": { "@types/filewriter": "*" } }, "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA=="], + + "@types/filewriter": ["@types/filewriter@0.0.33", "", {}, "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g=="], + + "@types/har-format": ["@types/har-format@1.2.16", "", {}, "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A=="], + + "@types/minimatch": ["@types/minimatch@3.0.5", "", {}, "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="], + + "@types/node": ["@types/node@22.5.0", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg=="], + + "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], + + "@webext-core/fake-browser": ["@webext-core/fake-browser@1.3.2", "", { "dependencies": { "lodash.merge": "^4.6.2" } }, "sha512-jFyPWWz+VkHAC9DRIiIPOyu6X/KlC8dYqSKweHz6tsDb86QawtVgZSpYcM+GOQBlZc5DHFo92jJ7cIq4uBnU0A=="], + + "@webext-core/isolated-element": ["@webext-core/isolated-element@1.1.2", "", { "dependencies": { "is-potential-custom-element-name": "^1.0.1" } }, "sha512-CNHYhsIR8TPkPb+4yqTIuzaGnVn/Fshev5fyoPW+/8Cyc93tJbCjP9PC1XSK6fDWu+xASdPHLZaoa2nWAYoxeQ=="], + + "@webext-core/match-patterns": ["@webext-core/match-patterns@1.0.3", "", {}, "sha512-NY39ACqCxdKBmHgw361M9pfJma8e4AZo20w9AY+5ZjIj1W2dvXC8J31G5fjfOGbulW9w4WKpT8fPooi0mLkn9A=="], + + "@wxt-dev/browser": ["@wxt-dev/browser@0.0.317", "", { "dependencies": { "@types/filesystem": "*", "@types/har-format": "*" } }, "sha512-tpFr/OJjTlGY7FLIr950fNi9fIBLQQ9pRVDDajeqEMip5LsXFAxpbF4I1GAGUkdTJEghKQ8P5N9XnsAdbPBAOQ=="], + + "@wxt-dev/module-solid": ["@wxt-dev/module-solid@1.1.3", "", { "dependencies": { "vite-plugin-solid": "^2.10.2" }, "peerDependencies": { "wxt": ">=0.19.16" } }, "sha512-iQthYvhe3OieJTLSq9z6747cYKHZ7XOVX/Cl5Rop/k+gcJ795u0j4lvVs3Tn+55uAC7xEye0eG2sLocaXZDZcg=="], + + "@wxt-dev/storage": ["@wxt-dev/storage@1.1.1", "", { "dependencies": { "async-mutex": "^0.5.0", "dequal": "^2.0.3" } }, "sha512-H1vYWeoWz03INV4r+sLYDFil88b3rgMMfgGp/EXy3bLbveJeiMiFs/G0bsBN2Ra87Iqlf2oVYRb/ABQpAugbew=="], + + "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + + "adm-zip": ["adm-zip@0.5.15", "", {}, "sha512-jYPWSeOA8EFoZnucrKCNihqBjoEGQSU4HKgHYQgKNEQ0pQF9a/DYuo/+fAxY76k4qe75LUlLWpAM1QWcBMTOKw=="], + + "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], + + "ansi-escapes": ["ansi-escapes@7.0.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw=="], + + "ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + + "array-differ": ["array-differ@4.0.0", "", {}, "sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw=="], + + "array-union": ["array-union@3.0.1", "", {}, "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "async-mutex": ["async-mutex@0.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA=="], + + "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], + + "atomically": ["atomically@2.0.3", "", { "dependencies": { "stubborn-fs": "^1.2.5", "when-exit": "^2.1.1" } }, "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw=="], + + "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], + + "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.38.1", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "validate-html-nesting": "^1.2.1" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-4FD4H69Cu4jHx2uLDEvx4YC5T/fC/Dmaafhsm8hXm7SjHYzjr09gBVyHdoFza+91f/g9e6tIzjbLCMkOXwmlew=="], + + "babel-preset-solid": ["babel-preset-solid@1.8.19", "", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.38.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-F3MoUdx3i4znhStnXUBno+5kGSbvhpbGrPgqfRPrS8W7foVJUOSd1/F9QDyd9dgClHfr+J7V14931eu1PEDDMQ=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], + + "bl": ["bl@5.1.0", "", { "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ=="], + + "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="], + + "bplist-parser": ["bplist-parser@0.2.0", "", { "dependencies": { "big-integer": "^1.6.44" } }, "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw=="], + + "brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.24.5", "", { "dependencies": { "caniuse-lite": "^1.0.30001716", "electron-to-chromium": "^1.5.149", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], + + "c12": ["c12@3.0.4", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^16.5.0", "exsolve": "^1.0.5", "giget": "^2.0.0", "jiti": "^2.4.2", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg=="], + + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + + "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001718", "", {}, "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw=="], + + "chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "chrome-launcher": ["chrome-launcher@1.1.2", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^2.0.1" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" } }, "sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw=="], + + "ci-info": ["ci-info@4.2.0", "", {}, "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg=="], + + "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], + + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], + + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], + + "cli-highlight": ["cli-highlight@2.1.11", "", { "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", "mz": "^2.4.0", "parse5": "^5.1.1", "parse5-htmlparser2-tree-adapter": "^6.0.0", "yargs": "^16.0.0" }, "bin": { "highlight": "bin/highlight" } }, "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg=="], + + "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], + + "cli-truncate": ["cli-truncate@4.0.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "concat-stream": ["concat-stream@1.6.2", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="], + + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + + "config-chain": ["config-chain@1.1.13", "", { "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="], + + "configstore": ["configstore@7.0.0", "", { "dependencies": { "atomically": "^2.0.3", "dot-prop": "^9.0.0", "graceful-fs": "^4.2.11", "xdg-basedir": "^5.1.0" } }, "sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ=="], + + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], + + "css-select": ["css-select@5.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg=="], + + "css-what": ["css-what@6.1.0", "", {}, "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="], + + "cssom": ["cssom@0.5.0", "", {}, "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "daisyui": ["daisyui@5.0.37", "", {}, "sha512-PLc+MhWAqTwolygEGPDi+ac+OsFqIt9nZylTIiyVlEx8loYL7Pt7hNWb8cp5pQQ9dhjYnda1ERiuM6OsJmvPGw=="], + + "debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "default-browser": ["default-browser@5.2.1", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg=="], + + "default-browser-id": ["default-browser-id@5.0.0", "", {}, "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA=="], + + "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], + + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], + + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destr": ["destr@2.0.3", "", {}, "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ=="], + + "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.1.0", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA=="], + + "dot-prop": ["dot-prop@9.0.0", "", { "dependencies": { "type-fest": "^4.18.2" } }, "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ=="], + + "dotenv": ["dotenv@16.5.0", "", {}, "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg=="], + + "dotenv-expand": ["dotenv-expand@12.0.2", "", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-lXpXz2ZE1cea1gL4sz2Ipj8y4PiVjytYr3Ij0SWoms1PGxIv7m2CRKuRuCRtHdVuvM/hNJPMxt5PbhboNC4dPQ=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.157", "", {}, "sha512-/0ybgsQd1muo8QlnuTpKwtl0oX5YMlUGbm8xyqgDU00motRkKFFbUJySAQBWcY79rVqNLWIWa87BGVGClwAB2w=="], + + "emoji-regex": ["emoji-regex@10.3.0", "", {}, "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw=="], + + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], + + "entities": ["entities@6.0.0", "", {}, "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw=="], + + "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], + + "esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], + + "escalade": ["escalade@3.1.2", "", {}, "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA=="], + + "escape-goat": ["escape-goat@4.0.0", "", {}, "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg=="], + + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "execa": ["execa@7.2.0", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", "human-signals": "^4.3.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" } }, "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA=="], + + "exsolve": ["exsolve@1.0.5", "", {}, "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg=="], + + "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": "cli.js" }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], + + "fastq": ["fastq@1.17.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w=="], + + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + + "fdir": ["fdir@6.4.4", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg=="], + + "filesize": ["filesize@10.1.6", "", {}, "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "firefox-profile": ["firefox-profile@4.7.0", "", { "dependencies": { "adm-zip": "~0.5.x", "fs-extra": "^11.2.0", "ini": "^4.1.3", "minimist": "^1.2.8", "xml2js": "^0.6.2" }, "bin": { "firefox-profile": "lib/cli.js" } }, "sha512-aGApEu5bfCNbA4PGUZiRJAIU6jKmghV2UVdklXAofnNtiDjqYw0czLS46W7IfFqVKgKhFB8Ao2YoNGHY4BoIMQ=="], + + "formdata-node": ["formdata-node@6.0.3", "", {}, "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg=="], + + "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], + + "fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "fx-runner": ["fx-runner@1.4.0", "", { "dependencies": { "commander": "2.9.0", "shell-quote": "1.7.3", "spawn-sync": "1.0.15", "when": "3.7.7", "which": "1.2.4", "winreg": "0.0.12" }, "bin": "bin/fx-runner" }, "sha512-rci1g6U0rdTg6bAaBboP7XdRu01dzTAaKXxFf+PUqGuCv6Xu7o8NZdY1D5MvKGIjb6EdS1g3VlXOgksir1uGkg=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-east-asian-width": ["get-east-asian-width@1.2.0", "", {}, "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA=="], + + "get-port-please": ["get-port-please@3.1.2", "", {}, "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ=="], + + "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], + + "global-directory": ["global-directory@4.0.1", "", { "dependencies": { "ini": "4.1.1" } }, "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q=="], + + "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graceful-readlink": ["graceful-readlink@1.0.1", "", {}, "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w=="], + + "growly": ["growly@1.3.0", "", {}, "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="], + + "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + + "html-entities": ["html-entities@2.3.3", "", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="], + + "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="], + + "htmlparser2": ["htmlparser2@10.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.1", "entities": "^6.0.0" } }, "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g=="], + + "human-signals": ["human-signals@4.3.1", "", {}, "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], + + "import-meta-resolve": ["import-meta-resolve@4.1.0", "", {}, "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@4.1.3", "", {}, "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg=="], + + "is-absolute": ["is-absolute@0.1.7", "", { "dependencies": { "is-relative": "^0.1.0" } }, "sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": "cli.js" }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-in-ci": ["is-in-ci@1.0.0", "", { "bin": { "is-in-ci": "cli.js" } }, "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": "cli.js" }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-installed-globally": ["is-installed-globally@1.0.0", "", { "dependencies": { "global-directory": "^4.0.1", "is-path-inside": "^4.0.0" } }, "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ=="], + + "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], + + "is-npm": ["is-npm@6.0.0", "", {}, "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], + + "is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + + "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], + + "is-primitive": ["is-primitive@3.0.1", "", {}, "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w=="], + + "is-relative": ["is-relative@0.1.3", "", {}, "sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA=="], + + "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], + + "is-unicode-supported": ["is-unicode-supported@2.0.0", "", {}, "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q=="], + + "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], + + "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@1.1.2", "", {}, "sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw=="], + + "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], + + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + + "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + + "jsesc": ["jsesc@2.5.2", "", { "bin": "bin/jsesc" }, "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + + "json5": ["json5@2.2.3", "", { "bin": "lib/cli.js" }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], + + "jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "ky": ["ky@1.8.1", "", {}, "sha512-7Bp3TpsE+L+TARSnnDpk3xg8Idi8RwSLdj6CMbNWoOARIrGrbuLGusV0dYwbZOm4bB3jHNxSw8Wk/ByDqJEnDw=="], + + "latest-version": ["latest-version@9.0.0", "", { "dependencies": { "package-json": "^10.0.0" } }, "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA=="], + + "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="], + + "lighthouse-logger": ["lighthouse-logger@2.0.1", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ=="], + + "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], + + "lines-and-columns": ["lines-and-columns@2.0.4", "", {}, "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A=="], + + "linkedom": ["linkedom@0.18.10", "", { "dependencies": { "css-select": "^5.1.0", "cssom": "^0.5.0", "html-escaper": "^3.0.3", "htmlparser2": "^10.0.0", "uhyphen": "^0.2.0" } }, "sha512-ESCqVAtme2GI3zZnlVRidiydByV6WmPlmKeFzFVQslADiAO2Wi+H6xL/5kr/pUOESjEoVb2Eb3cYFJ/TQhQOWA=="], + + "listr2": ["listr2@8.2.4", "", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g=="], + + "local-pkg": ["local-pkg@1.1.1", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.0.1", "quansync": "^0.2.8" } }, "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lodash.kebabcase": ["lodash.kebabcase@4.1.1", "", {}, "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="], + + "log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], + + "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="], + + "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], + + "many-keys-map": ["many-keys-map@2.0.1", "", {}, "sha512-DHnZAD4phTbZ+qnJdjoNEVU1NecYoSdbOOoVmTDH46AuxDkEVh3MxTVpXq10GtcTC6mndN9dkv1rNfpjRcLnOw=="], + + "marky": ["marky@1.2.5", "", {}, "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q=="], + + "merge-anything": ["merge-anything@5.1.7", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + + "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + + "minimatch": ["minimatch@10.0.1", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], + + "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + + "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "multimatch": ["multimatch@6.0.0", "", { "dependencies": { "@types/minimatch": "^3.0.5", "array-differ": "^4.0.0", "array-union": "^3.0.1", "minimatch": "^3.0.4" } }, "sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ=="], + + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], + + "nano-spawn": ["nano-spawn@0.2.1", "", {}, "sha512-/pULofvsF8mOVcl/nUeVXL/GYOEvc7eJWSIxa+K4OYUolvXa5zwSgevsn4eoHs1xvh/BO3vx/PZiD9+Ow2ZVuw=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="], + + "node-forge": ["node-forge@1.3.1", "", {}, "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="], + + "node-notifier": ["node-notifier@10.0.1", "", { "dependencies": { "growly": "^1.3.0", "is-wsl": "^2.2.0", "semver": "^7.3.5", "shellwords": "^0.1.1", "uuid": "^8.3.2", "which": "^2.0.2" } }, "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], + + "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "nypm": ["nypm@0.6.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "pathe": "^2.0.3", "pkg-types": "^2.0.0", "tinyexec": "^0.3.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "ofetch": ["ofetch@1.3.4", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.3", "ufo": "^1.5.3" } }, "sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw=="], + + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + + "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + + "open": ["open@10.1.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" } }, "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw=="], + + "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="], + + "os-shim": ["os-shim@0.1.3", "", {}, "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A=="], + + "package-json": ["package-json@10.0.1", "", { "dependencies": { "ky": "^1.2.0", "registry-auth-token": "^5.0.2", "registry-url": "^6.0.1", "semver": "^7.6.0" } }, "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg=="], + + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + + "parse-json": ["parse-json@7.1.1", "", { "dependencies": { "@babel/code-frame": "^7.21.4", "error-ex": "^1.3.2", "json-parse-even-better-errors": "^3.0.0", "lines-and-columns": "^2.0.3", "type-fest": "^3.8.0" } }, "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw=="], + + "parse5": ["parse5@5.1.1", "", {}, "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug=="], + + "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@6.0.1", "", { "dependencies": { "parse5": "^6.0.1" } }, "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + + "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pino": ["pino@9.6.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^4.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg=="], + + "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="], + + "pino-std-serializers": ["pino-std-serializers@7.0.0", "", {}, "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA=="], + + "pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + + "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "process-warning": ["process-warning@4.0.1", "", {}, "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q=="], + + "promise-toolbox": ["promise-toolbox@0.21.0", "", { "dependencies": { "make-error": "^1.3.2" } }, "sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg=="], + + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + + "proto-list": ["proto-list@1.2.4", "", {}, "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="], + + "publish-browser-extension": ["publish-browser-extension@3.0.0", "", { "dependencies": { "cac": "^6.7.14", "cli-highlight": "^2.1.11", "consola": "^3.2.3", "dotenv": "^16.3.1", "extract-zip": "^2.0.1", "formdata-node": "^6.0.3", "listr2": "^8.0.1", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", "ofetch": "^1.3.3", "open": "^9.1.0", "ora": "^6.3.1", "prompts": "^2.4.2", "zod": "^3.22.4" }, "bin": { "publish-extension": "bin/publish-extension.cjs" } }, "sha512-gwjH8mIepNqID2VqKIxzT6lmtvkcc5tcWYzrGSUdkeUFFFSHhGp9xx01EZ7j8wPq50dDe0XU5VNbHMAqr6wWAA=="], + + "pump": ["pump@3.0.0", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="], + + "pupa": ["pupa@3.1.0", "", { "dependencies": { "escape-goat": "^4.0.0" } }, "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug=="], + + "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": "cli.js" }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="], + + "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], + + "regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], + + "registry-auth-token": ["registry-auth-token@5.0.2", "", { "dependencies": { "@pnpm/npm-conf": "^2.1.0" } }, "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ=="], + + "registry-url": ["registry-url@6.0.1", "", { "dependencies": { "rc": "1.2.8" } }, "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + + "rollup": ["rollup@4.21.0", "", { "dependencies": { "@types/estree": "1.0.5" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.21.0", "@rollup/rollup-android-arm64": "4.21.0", "@rollup/rollup-darwin-arm64": "4.21.0", "@rollup/rollup-darwin-x64": "4.21.0", "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", "@rollup/rollup-linux-arm-musleabihf": "4.21.0", "@rollup/rollup-linux-arm64-gnu": "4.21.0", "@rollup/rollup-linux-arm64-musl": "4.21.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", "@rollup/rollup-linux-riscv64-gnu": "4.21.0", "@rollup/rollup-linux-s390x-gnu": "4.21.0", "@rollup/rollup-linux-x64-gnu": "4.21.0", "@rollup/rollup-linux-x64-musl": "4.21.0", "@rollup/rollup-win32-arm64-msvc": "4.21.0", "@rollup/rollup-win32-ia32-msvc": "4.21.0", "@rollup/rollup-win32-x64-msvc": "4.21.0", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ=="], + + "run-applescript": ["run-applescript@7.0.0", "", {}, "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + + "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], + + "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], + + "semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "seroval": ["seroval@1.3.1", "", {}, "sha512-F+T9EQPdLzgdewgxnBh4mSc+vde+EOkU6dC9BDuu/bfGb+UyUlqM6t8znFCTPQSuai/ZcfFg0gu79h+bVW2O0w=="], + + "seroval-plugins": ["seroval-plugins@1.3.1", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-dOlUoiI3fgZbQIcj6By+l865pzeWdP3XCSLdI3xlKnjCk5983yLWPsXytFOUI0BUZKG9qwqbj78n9yVcVwUqaQ=="], + + "set-value": ["set-value@4.1.0", "", { "dependencies": { "is-plain-object": "^2.0.4", "is-primitive": "^3.0.1" } }, "sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw=="], + + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shell-quote": ["shell-quote@1.7.3", "", {}, "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw=="], + + "shellwords": ["shellwords@0.1.1", "", {}, "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], + + "solid-js": ["solid-js@1.9.7", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", "seroval-plugins": "~1.3.0" } }, "sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw=="], + + "solid-refresh": ["solid-refresh@0.6.3", "", { "dependencies": { "@babel/generator": "^7.23.6", "@babel/helper-module-imports": "^7.22.15", "@babel/types": "^7.23.6" }, "peerDependencies": { "solid-js": "^1.3" } }, "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA=="], + + "sonic-boom": ["sonic-boom@4.2.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww=="], + + "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "spawn-sync": ["spawn-sync@1.0.15", "", { "dependencies": { "concat-stream": "^1.4.7", "os-shim": "^0.1.2" } }, "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw=="], + + "split": ["split@1.0.1", "", { "dependencies": { "through": "2" } }, "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="], + + "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "strip-bom": ["strip-bom@5.0.0", "", {}, "sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A=="], + + "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], + + "strip-json-comments": ["strip-json-comments@5.0.1", "", {}, "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw=="], + + "strip-literal": ["strip-literal@2.1.1", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q=="], + + "stubborn-fs": ["stubborn-fs@1.2.5", "", {}, "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "tailwindcss": ["tailwindcss@4.1.7", "", {}, "sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg=="], + + "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="], + + "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], + + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], + + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + + "thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + + "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], + + "titleize": ["titleize@3.0.0", "", {}, "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ=="], + + "tmp": ["tmp@0.2.3", "", {}, "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w=="], + + "to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "tslib": ["tslib@2.7.0", "", {}, "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="], + + "type-fest": ["type-fest@3.13.1", "", {}, "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="], + + "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "ufo": ["ufo@1.5.4", "", {}, "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="], + + "uhyphen": ["uhyphen@0.2.0", "", {}, "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA=="], + + "undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], + + "unimport": ["unimport@3.14.6", "", { "dependencies": { "@rollup/pluginutils": "^5.1.4", "acorn": "^8.14.0", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "fast-glob": "^3.3.3", "local-pkg": "^1.0.0", "magic-string": "^0.30.17", "mlly": "^1.7.4", "pathe": "^2.0.1", "picomatch": "^4.0.2", "pkg-types": "^1.3.0", "scule": "^1.3.0", "strip-literal": "^2.1.1", "unplugin": "^1.16.1" } }, "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unplugin": ["unplugin@1.16.1", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w=="], + + "untildify": ["untildify@4.0.0", "", {}, "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + + "update-notifier": ["update-notifier@7.3.1", "", { "dependencies": { "boxen": "^8.0.1", "chalk": "^5.3.0", "configstore": "^7.0.0", "is-in-ci": "^1.0.0", "is-installed-globally": "^1.0.0", "is-npm": "^6.0.0", "latest-version": "^9.0.0", "pupa": "^3.1.0", "semver": "^7.6.3", "xdg-basedir": "^5.1.0" } }, "sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "uuid": ["uuid@8.3.2", "", { "bin": "dist/bin/uuid" }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "validate-html-nesting": ["validate-html-nesting@1.2.2", "", {}, "sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg=="], + + "vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="], + + "vite-node": ["vite-node@3.1.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA=="], + + "vite-plugin-solid": ["vite-plugin-solid@2.10.2", "", { "dependencies": { "@babel/core": "^7.23.3", "@types/babel__core": "^7.20.4", "babel-preset-solid": "^1.8.4", "merge-anything": "^5.1.7", "solid-refresh": "^0.6.3", "vitefu": "^0.2.5" }, "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["@testing-library/jest-dom"] }, "sha512-AOEtwMe2baBSXMXdo+BUwECC8IFHcKS6WQV/1NEd+Q7vHPap5fmIhLcAzr+DUJ04/KHx/1UBU0l1/GWP+rMAPQ=="], + + "vitefu": ["vitefu@0.2.5", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q=="], + + "watchpack": ["watchpack@2.4.2", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw=="], + + "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], + + "web-ext-run": ["web-ext-run@0.2.3", "", { "dependencies": { "@babel/runtime": "7.27.0", "@devicefarmer/adbkit": "3.3.8", "chrome-launcher": "1.1.2", "debounce": "1.2.1", "es6-error": "4.1.1", "firefox-profile": "4.7.0", "fx-runner": "1.4.0", "multimatch": "6.0.0", "node-notifier": "10.0.1", "parse-json": "7.1.1", "pino": "9.6.0", "promise-toolbox": "0.21.0", "set-value": "4.1.0", "source-map-support": "0.5.21", "strip-bom": "5.0.0", "strip-json-comments": "5.0.1", "tmp": "0.2.3", "update-notifier": "7.3.1", "watchpack": "2.4.2", "ws": "8.18.1", "zip-dir": "2.0.0" } }, "sha512-u/IiZaZ7dHFqTM1MLF27rBy8mS9fEEsqoOKL0u+kQdOLmEioA/0Szp67ADd3WAJZLd8/hO8cFST1IC/YMXKIjQ=="], + + "web-vitals": ["web-vitals@4.2.4", "", {}, "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw=="], + + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + + "when": ["when@3.7.7", "", {}, "sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw=="], + + "when-exit": ["when-exit@2.1.4", "", {}, "sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg=="], + + "which": ["which@1.2.4", "", { "dependencies": { "is-absolute": "^0.1.7", "isexe": "^1.1.1" }, "bin": "bin/which" }, "sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA=="], + + "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="], + + "winreg": ["winreg@0.0.12", "", {}, "sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ=="], + + "wrap-ansi": ["wrap-ansi@9.0.0", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="], + + "wxt": ["wxt@0.20.6", "", { "dependencies": { "@1natsu/wait-element": "^4.1.2", "@aklinker1/rollup-plugin-visualizer": "5.12.0", "@webext-core/fake-browser": "^1.3.2", "@webext-core/isolated-element": "^1.1.2", "@webext-core/match-patterns": "^1.0.3", "@wxt-dev/browser": "0.0.317", "@wxt-dev/storage": "^1.0.0", "async-mutex": "^0.5.0", "c12": "^3.0.3", "cac": "^6.7.14", "chokidar": "^4.0.3", "ci-info": "^4.2.0", "consola": "^3.4.2", "defu": "^6.1.4", "dotenv": "^16.4.7", "dotenv-expand": "^12.0.1", "esbuild": "^0.25.0", "fast-glob": "^3.3.3", "filesize": "^10.1.6", "fs-extra": "^11.3.0", "get-port-please": "^3.1.2", "giget": "^1.2.3 || ^2.0.0", "hookable": "^5.5.3", "import-meta-resolve": "^4.1.0", "is-wsl": "^3.1.0", "json5": "^2.2.3", "jszip": "^3.10.1", "linkedom": "^0.18.9", "magicast": "^0.3.5", "minimatch": "^10.0.1", "nano-spawn": "^0.2.0", "normalize-path": "^3.0.0", "nypm": "^0.6.0", "ohash": "^2.0.11", "open": "^10.1.0", "ora": "^8.2.0", "perfect-debounce": "^1.0.0", "picocolors": "^1.1.1", "prompts": "^2.4.2", "publish-browser-extension": "^2.3.0 || ^3.0.0", "scule": "^1.3.0", "unimport": "^3.13.1 || ^4.0.0 || ^5.0.0", "vite": "^5.4.17 || ^6.2.5", "vite-node": "^2.1.4 || ^3.0.0", "web-ext-run": "^0.2.3" }, "bin": { "wxt": "bin/wxt.mjs", "wxt-publish-extension": "bin/wxt-publish-extension.cjs" } }, "sha512-CdExyv2yWfpmPWFjhrKBA+nUSHOTRpRKqScod66AaLpMQ0famZ18tM0+4a9m7oX4Pts1XZH4nw79XQp06QsC2Q=="], + + "xdg-basedir": ["xdg-basedir@5.1.0", "", {}, "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ=="], + + "xml2js": ["xml2js@0.6.2", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA=="], + + "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yaml": ["yaml@2.5.0", "", { "bin": "bin.mjs" }, "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "zip-dir": ["zip-dir@2.0.0", "", { "dependencies": { "async": "^3.2.0", "jszip": "^3.2.2" } }, "sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg=="], + + "zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], + + "@aklinker1/rollup-plugin-visualizer/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "@babel/code-frame/picocolors": ["picocolors@1.0.1", "", {}, "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="], + + "@babel/core/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="], + + "@babel/helper-compilation-targets/browserslist": ["browserslist@4.23.3", "", { "dependencies": { "caniuse-lite": "^1.0.30001646", "electron-to-chromium": "^1.5.4", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, "bin": "cli.js" }, "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA=="], + + "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "@babel/highlight/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "@babel/highlight/picocolors": ["picocolors@1.0.1", "", {}, "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="], + + "@babel/traverse/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="], + + "@devicefarmer/adbkit/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="], + + "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], + + "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@rollup/pluginutils/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.10", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" }, "bundled": true }, "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], + + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "boxen/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "chrome-launcher/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "chrome-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "citty/consola": ["consola@3.2.3", "", {}, "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ=="], + + "cli-highlight/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "cli-highlight/yargs": ["yargs@16.2.0", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], + + "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "config-chain/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "dot-prop/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "dotenv-expand/dotenv": ["dotenv@16.4.5", "", {}, "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg=="], + + "execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "execa/onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], + + "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "extract-zip/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="], + + "fx-runner/commander": ["commander@2.9.0", "", { "dependencies": { "graceful-readlink": ">= 1.0.0" } }, "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A=="], + + "global-directory/ini": ["ini@4.1.1", "", {}, "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g=="], + + "htmlparser2/domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": "cli.js" }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], + + "log-update/slice-ansi": ["slice-ansi@7.1.0", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg=="], + + "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "multimatch/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "node-notifier/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "node-notifier/semver": ["semver@7.6.3", "", { "bin": "bin/semver.js" }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "node-notifier/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "ofetch/node-fetch-native": ["node-fetch-native@1.6.4", "", {}, "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ=="], + + "package-json/semver": ["semver@7.6.3", "", { "bin": "bin/semver.js" }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "parse5-htmlparser2-tree-adapter/parse5": ["parse5@6.0.1", "", {}, "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="], + + "publish-browser-extension/open": ["open@9.1.0", "", { "dependencies": { "default-browser": "^4.0.0", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^2.2.0" } }, "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg=="], + + "publish-browser-extension/ora": ["ora@6.3.1", "", { "dependencies": { "chalk": "^5.0.0", "cli-cursor": "^4.0.0", "cli-spinners": "^2.6.1", "is-interactive": "^2.0.0", "is-unicode-supported": "^1.1.0", "log-symbols": "^5.1.0", "stdin-discarder": "^0.1.0", "strip-ansi": "^7.0.1", "wcwidth": "^1.0.1" } }, "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ=="], + + "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "slice-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "tinyglobby/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "unimport/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "unimport/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "update-browserslist-db/escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "update-notifier/semver": ["semver@7.6.3", "", { "bin": "bin/semver.js" }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "vite/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "vite/rollup": ["rollup@4.41.0", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.41.0", "@rollup/rollup-android-arm64": "4.41.0", "@rollup/rollup-darwin-arm64": "4.41.0", "@rollup/rollup-darwin-x64": "4.41.0", "@rollup/rollup-freebsd-arm64": "4.41.0", "@rollup/rollup-freebsd-x64": "4.41.0", "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", "@rollup/rollup-linux-arm-musleabihf": "4.41.0", "@rollup/rollup-linux-arm64-gnu": "4.41.0", "@rollup/rollup-linux-arm64-musl": "4.41.0", "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", "@rollup/rollup-linux-riscv64-gnu": "4.41.0", "@rollup/rollup-linux-riscv64-musl": "4.41.0", "@rollup/rollup-linux-s390x-gnu": "4.41.0", "@rollup/rollup-linux-x64-gnu": "4.41.0", "@rollup/rollup-linux-x64-musl": "4.41.0", "@rollup/rollup-win32-arm64-msvc": "4.41.0", "@rollup/rollup-win32-ia32-msvc": "4.41.0", "@rollup/rollup-win32-x64-msvc": "4.41.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg=="], + + "vite-node/vite": ["vite@5.4.2", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.41", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": "bin/vite.js" }, "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA=="], + + "vite-plugin-solid/vite": ["vite@5.4.2", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.41", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": "bin/vite.js" }, "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA=="], + + "vitefu/vite": ["vite@5.4.2", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.41", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": "bin/vite.js" }, "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "@aklinker1/rollup-plugin-visualizer/open/define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + + "@aklinker1/rollup-plugin-visualizer/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "@babel/core/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001653", "", {}, "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw=="], + + "@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.13", "", {}, "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q=="], + + "@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.18", "", {}, "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="], + + "@babel/helper-compilation-targets/browserslist/update-browserslist-db": ["update-browserslist-db@1.1.0", "", { "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ=="], + + "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "@babel/traverse/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "@devicefarmer/adbkit/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "cli-highlight/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + + "cli-highlight/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "cli-highlight/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + + "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "extract-zip/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.0.0", "", { "dependencies": { "get-east-asian-width": "^1.0.0" } }, "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA=="], + + "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "multimatch/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "node-notifier/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "publish-browser-extension/open/default-browser": ["default-browser@4.0.0", "", { "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", "execa": "^7.1.1", "titleize": "^3.0.0" } }, "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA=="], + + "publish-browser-extension/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "publish-browser-extension/ora/cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="], + + "publish-browser-extension/ora/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], + + "publish-browser-extension/ora/log-symbols": ["log-symbols@5.1.0", "", { "dependencies": { "chalk": "^5.0.0", "is-unicode-supported": "^1.1.0" } }, "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA=="], + + "publish-browser-extension/ora/stdin-discarder": ["stdin-discarder@0.1.0", "", { "dependencies": { "bl": "^5.0.0" } }, "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ=="], + + "unimport/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "vite-node/vite/esbuild": ["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" }, "bin": "bin/esbuild" }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "vite-node/vite/postcss": ["postcss@8.4.41", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", "source-map-js": "^1.2.0" } }, "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ=="], + + "vite-plugin-solid/vite/esbuild": ["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" }, "bin": "bin/esbuild" }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "vite-plugin-solid/vite/postcss": ["postcss@8.4.41", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", "source-map-js": "^1.2.0" } }, "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ=="], + + "vite/rollup/@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.41.0", "", { "os": "android", "cpu": "arm" }, "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A=="], + + "vite/rollup/@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.41.0", "", { "os": "android", "cpu": "arm64" }, "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ=="], + + "vite/rollup/@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.41.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw=="], + + "vite/rollup/@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.41.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ=="], + + "vite/rollup/@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.41.0", "", { "os": "linux", "cpu": "arm" }, "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA=="], + + "vite/rollup/@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.41.0", "", { "os": "linux", "cpu": "arm" }, "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg=="], + + "vite/rollup/@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.41.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw=="], + + "vite/rollup/@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.41.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ=="], + + "vite/rollup/@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.41.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg=="], + + "vite/rollup/@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.41.0", "", { "os": "linux", "cpu": "none" }, "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A=="], + + "vite/rollup/@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.41.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw=="], + + "vite/rollup/@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.41.0", "", { "os": "linux", "cpu": "x64" }, "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ=="], + + "vite/rollup/@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.41.0", "", { "os": "linux", "cpu": "x64" }, "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg=="], + + "vite/rollup/@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.41.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg=="], + + "vite/rollup/@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.41.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ=="], + + "vite/rollup/@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.41.0", "", { "os": "win32", "cpu": "x64" }, "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA=="], + + "vite/rollup/@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], + + "vitefu/vite/esbuild": ["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" }, "bin": "bin/esbuild" }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "vitefu/vite/postcss": ["postcss@8.4.41", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", "source-map-js": "^1.2.0" } }, "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ=="], + + "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@babel/helper-compilation-targets/browserslist/update-browserslist-db/picocolors": ["picocolors@1.0.1", "", {}, "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="], + + "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "cli-highlight/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "cli-highlight/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "cli-highlight/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "cli-highlight/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "publish-browser-extension/open/default-browser/bundle-name": ["bundle-name@3.0.0", "", { "dependencies": { "run-applescript": "^5.0.0" } }, "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw=="], + + "publish-browser-extension/open/default-browser/default-browser-id": ["default-browser-id@3.0.0", "", { "dependencies": { "bplist-parser": "^0.2.0", "untildify": "^4.0.0" } }, "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA=="], + + "publish-browser-extension/ora/cli-cursor/restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="], + + "vite-node/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "vite-node/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "vite-node/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "vite-node/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "vite-node/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "vite-node/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "vite-node/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "vite-node/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "vite-node/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "vite-node/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "vite-node/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "vite-node/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "vite-node/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "vite-node/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "vite-node/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "vite-node/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "vite-node/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "vite-node/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "vite-node/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "vite-node/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "vite-node/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "vite-node/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "vite-node/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "vite-node/vite/postcss/nanoid": ["nanoid@3.3.7", "", { "bin": "bin/nanoid.cjs" }, "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="], + + "vite-node/vite/postcss/picocolors": ["picocolors@1.0.1", "", {}, "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="], + + "vite-node/vite/postcss/source-map-js": ["source-map-js@1.2.0", "", {}, "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "vite-plugin-solid/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "vite-plugin-solid/vite/postcss/nanoid": ["nanoid@3.3.7", "", { "bin": "bin/nanoid.cjs" }, "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="], + + "vite-plugin-solid/vite/postcss/picocolors": ["picocolors@1.0.1", "", {}, "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="], + + "vite-plugin-solid/vite/postcss/source-map-js": ["source-map-js@1.2.0", "", {}, "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="], + + "vitefu/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "vitefu/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "vitefu/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "vitefu/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "vitefu/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "vitefu/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "vitefu/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "vitefu/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "vitefu/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "vitefu/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "vitefu/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "vitefu/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "vitefu/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "vitefu/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "vitefu/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "vitefu/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "vitefu/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "vitefu/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "vitefu/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "vitefu/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "vitefu/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "vitefu/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "vitefu/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "vitefu/vite/postcss/nanoid": ["nanoid@3.3.7", "", { "bin": "bin/nanoid.cjs" }, "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="], + + "vitefu/vite/postcss/picocolors": ["picocolors@1.0.1", "", {}, "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="], + + "vitefu/vite/postcss/source-map-js": ["source-map-js@1.2.0", "", {}, "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="], + + "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "cli-highlight/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "cli-highlight/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript": ["run-applescript@5.0.0", "", { "dependencies": { "execa": "^5.0.0" } }, "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg=="], + + "publish-browser-extension/ora/cli-cursor/restore-cursor/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "publish-browser-extension/ora/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "publish-browser-extension/ora/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + + "publish-browser-extension/open/default-browser/bundle-name/run-applescript/execa/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + } +} diff --git a/spot/bun.lockb b/spot/bun.lockb deleted file mode 100755 index 18d7c5959bcb8972ea1d2ce7ccf4dddaac58b725..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274253 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 z 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

VXd;PzgPc{qkWG4SR^|q72h>H=&^xR4vY^ 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 diff --git a/spot/entrypoints/content/RecordingControls.tsx b/spot/entrypoints/content/RecordingControls.tsx index ecbef8c85..e36b70950 100644 --- a/spot/entrypoints/content/RecordingControls.tsx +++ b/spot/entrypoints/content/RecordingControls.tsx @@ -1,7 +1,7 @@ import { createSignal, onCleanup, createEffect } from "solid-js"; import { STATES, formatMsToTime } from "~/entrypoints/content/utils"; import micOn from "~/assets/mic-on.svg"; -import { createDraggable } from "@neodrag/solid"; +import { createDraggable } from '@neodrag/solid'; interface IRControls { pause: () => void; @@ -144,7 +144,7 @@ function RecordingControls({ {recording() ? ( + + ); +} + export default observer(ChatInput); diff --git a/frontend/app/components/Kai/components/ChatLog.tsx b/frontend/app/components/Kai/components/ChatLog.tsx index 5c3dca6c5..d06e9df4b 100644 --- a/frontend/app/components/Kai/components/ChatLog.tsx +++ b/frontend/app/components/Kai/components/ChatLog.tsx @@ -1,7 +1,7 @@ import React from 'react'; import ChatInput from './ChatInput'; import ChatMsg, { ChatNotice } from './ChatMsg'; -import Ideas from "./Ideas"; +import Ideas from './Ideas'; import { Loader } from 'UI'; import { kaiStore } from '../KaiStore'; import { observer } from 'mobx-react-lite'; @@ -9,17 +9,17 @@ import { observer } from 'mobx-react-lite'; function ChatLog({ projectId, threadId, - userLetter, initialMsg, chatTitle, setInitialMsg, + onCancel, }: { projectId: string; threadId: any; - userLetter: string; initialMsg: string | null; setInitialMsg: (msg: string | null) => void; chatTitle: string | null; + onCancel: () => void; }) { const messages = kaiStore.messages; const loading = kaiStore.loadingChat; @@ -51,11 +51,15 @@ function ChatLog({ }); }, [messages.length, processingStage]); - const lastHumanMsgInd: null | number = kaiStore.lastHumanMessage.index; + const lastKaiMessageInd: null | number = kaiStore.lastKaiMessage.index; + const lastHumanMsgInd: number | null = kaiStore.lastHumanMessage.index; + const showIdeas = + !processingStage && lastKaiMessageInd === messages.length - 1; return (

( ) : null} - {(!processingStage && lastHumanMsgInd && messages.length == lastHumanMsgInd + 2) ? onSubmit(query)} projectId={projectId} threadId={threadId}/> : null} + {showIdeas ? ( + onSubmit(query)} + projectId={projectId} + threadId={threadId} + /> + ) : null}
-
- +
+
diff --git a/frontend/app/components/Kai/components/ChatMsg.tsx b/frontend/app/components/Kai/components/ChatMsg.tsx index d335952ae..5239f9745 100644 --- a/frontend/app/components/Kai/components/ChatMsg.tsx +++ b/frontend/app/components/Kai/components/ChatMsg.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Icon, CopyButton } from 'UI'; +import { CopyButton } from 'UI'; import { observer } from 'mobx-react-lite'; import cn from 'classnames'; import Markdown from 'react-markdown'; @@ -8,7 +8,7 @@ import { Loader, ThumbsUp, ThumbsDown, - ListRestart, + SquarePen, FileDown, Clock, ChartLine, @@ -20,6 +20,7 @@ import { durationFormatted } from 'App/date'; import WidgetChart from '@/components/Dashboard/components/WidgetChart'; import Widget from 'App/mstore/types/widget'; import { useTranslation } from 'react-i18next'; +import SessionItem from 'Shared/SessionItem'; function ChatMsg({ userName, @@ -168,28 +169,12 @@ function ChatMsg({ }, [metricData, chart_data]); return (
- {isUser ? ( -
- {userName} -
- ) : ( -
- -
- )} -
+
) : null} + {message.sessions ? ( +
+ {message.sessions.map((session) => ( +
+ +
+ ))} +
+ ) : null} {isUser ? ( - <> -
- -
{t('Edit')}
-
+
+ +
+ +
+
{t('Cancel')}
- +
) : (
{duration ? : null} diff --git a/frontend/app/components/Kai/components/ChatsModal.tsx b/frontend/app/components/Kai/components/ChatsModal.tsx index 16f374d15..8fb279aea 100644 --- a/frontend/app/components/Kai/components/ChatsModal.tsx +++ b/frontend/app/components/Kai/components/ChatsModal.tsx @@ -44,10 +44,13 @@ function ChatsModal({ refetch(); }; return ( -
+
- {t('Chats')} + {t('Previous Chats')}
{usage.percent > 80 ? (
diff --git a/frontend/app/components/Kai/components/Ideas.tsx b/frontend/app/components/Kai/components/Ideas.tsx index f1104756e..bade87acb 100644 --- a/frontend/app/components/Kai/components/Ideas.tsx +++ b/frontend/app/components/Kai/components/Ideas.tsx @@ -4,54 +4,69 @@ import { useQuery } from '@tanstack/react-query'; import { kaiService } from 'App/services'; import { useTranslation } from 'react-i18next'; -function Ideas({ onClick, projectId, threadId = null }: { onClick: (query: string) => void, projectId: string, threadId?: string | null }) { +function Ideas({ + onClick, + projectId, + threadId = null, +}: { + onClick: (query: string) => void; + projectId: string; + threadId?: string | null; +}) { const { t } = useTranslation(); - const { - data: suggestedPromptIdeas = [], - isPending, - } = useQuery({ - queryKey: ['kai', projectId, 'chats', threadId, 'prompt-suggestions'], - queryFn: () => kaiService.getPromptSuggestions(projectId, threadId), - staleTime: 1000 * 60, + const { data: suggestedPromptIdeas = [], isPending } = useQuery({ + queryKey: ['kai', projectId, 'chats', threadId, 'prompt-suggestions'], + queryFn: () => kaiService.getPromptSuggestions(projectId, threadId), + staleTime: 1000 * 60, }); const ideas = React.useMemo(() => { - const defaultPromptIdeas = [ - 'Top user journeys', - 'Where do users drop off', - 'Failed network requests today', - ]; - const result = suggestedPromptIdeas; - const targetSize = 3; - while (result.length < targetSize && defaultPromptIdeas.length) { - result.push(defaultPromptIdeas.pop()) - } + const defaultPromptIdeas = [ + 'Top user journeys', + 'Where do users drop off', + 'Failed network requests today', + ]; + const result = suggestedPromptIdeas; + const targetSize = 3; + while (result.length < targetSize && defaultPromptIdeas.length) { + result.push(defaultPromptIdeas.pop()); + } return result; }, [suggestedPromptIdeas.length]); return ( - <> +
- - Ideas: + Suggested Ideas:
- { - isPending ? - (
{t('Generating ideas')}...
) : - (
{ideas.map(title => ())}
) - } - + {isPending ? ( +
+ {t('Generating ideas')}... +
+ ) : ( +
+ {ideas.map((title) => ( + + ))} +
+ )} +
); } -function IdeaItem({ title, onClick }: { title: string, onClick: (query: string) => void }) { +function IdeaItem({ + title, + onClick, +}: { + title: string; + onClick: (query: string) => void; +}) { return (
onClick(title)} className={ - 'flex items-center gap-2 cursor-pointer text-gray-dark hover:text-black' + 'cursor-pointer text-gray-dark hover:text-black rounded-full px-4 py-2 shadow border' } > - - {title} + {title}
); } diff --git a/frontend/app/components/Kai/components/IntroSection.tsx b/frontend/app/components/Kai/components/IntroSection.tsx index c6356e9ba..dd28f667a 100644 --- a/frontend/app/components/Kai/components/IntroSection.tsx +++ b/frontend/app/components/Kai/components/IntroSection.tsx @@ -2,24 +2,34 @@ import React from 'react'; import ChatInput from './ChatInput'; import Ideas from './Ideas'; -function IntroSection({ onAsk, projectId }: { onAsk: (query: string) => void, projectId: string }) { +function IntroSection({ + onAsk, + onCancel, + userName, + projectId, +}: { + onAsk: (query: string) => void; + projectId: string; + onCancel: () => void; + userName: string; +}) { const isLoading = false; return ( <> -
- Kai is your AI assistant, delivering smart insights in response to your - queries. -
-
- {/* null} />*/} - +
+
+ Hey {userName}, how can I help you? +
+
onAsk(query)} projectId={projectId} />
-
- OpenReplay AI can make mistakes. Verify its outputs. -
); } diff --git a/frontend/app/components/Modal/index.tsx b/frontend/app/components/Modal/index.tsx index 3b84beeb8..22a531656 100644 --- a/frontend/app/components/Modal/index.tsx +++ b/frontend/app/components/Modal/index.tsx @@ -1,6 +1,7 @@ // @ts-nocheck import React, { Component, createContext } from 'react'; import Modal from './Modal'; +import { className } from '@medv/finder'; const ModalContext = createContext({ component: null, @@ -29,6 +30,7 @@ export class ModalProvider extends Component { this.setState({ component, props, + className: props.className || undefined, }); document.addEventListener('keydown', this.handleKeyDown); document.querySelector('body').style.overflow = 'hidden'; diff --git a/frontend/app/components/shared/SessionItem/SessionItem.tsx b/frontend/app/components/shared/SessionItem/SessionItem.tsx index af42caf1d..23128a84f 100644 --- a/frontend/app/components/shared/SessionItem/SessionItem.tsx +++ b/frontend/app/components/shared/SessionItem/SessionItem.tsx @@ -71,6 +71,7 @@ interface Props { bookmarked?: boolean; toggleFavorite?: (sessionId: string) => void; query?: string; + slim?: boolean; } const PREFETCH_STATE = { @@ -99,6 +100,7 @@ function SessionItem(props: RouteComponentProps & Props) { isDisabled, live: propsLive, isAdd, + slim, } = props; const { @@ -261,7 +263,7 @@ function SessionItem(props: RouteComponentProps & Props) { } >
e.stopPropagation()} onMouseEnter={handleHover} @@ -343,7 +345,7 @@ function SessionItem(props: RouteComponentProps & Props) { : 'Event'}
- + )}
@@ -373,7 +375,7 @@ function SessionItem(props: RouteComponentProps & Props) { )} {userOs && userBrowser && ( - + )} {userOs && ( )} {userOs && ( - + )} + ); +} + +export default Kai_mono; diff --git a/frontend/app/components/ui/SVG.tsx b/frontend/app/components/ui/SVG.tsx index 36dedf09d..e10f6830c 100644 --- a/frontend/app/components/ui/SVG.tsx +++ b/frontend/app/components/ui/SVG.tsx @@ -355,6 +355,7 @@ import { Integrations_vuejs, Integrations_zustand, Journal_code, + Kai_mono, Kai, Kai_colored, Key, @@ -487,7 +488,7 @@ import { Zoom_in } from './Icons' -export type IconNames = 'activity' | 'analytics' | 'anchor' | 'arrow-bar-left' | 'arrow-clockwise' | 'arrow-counterclockwise' | 'arrow-down-short' | 'arrow-down-up' | 'arrow-down' | 'arrow-repeat' | 'arrow-right-short' | 'arrow-up-short' | 'arrow-up' | 'avatar/icn_avatar1' | 'avatar/icn_avatar10' | 'avatar/icn_avatar11' | 'avatar/icn_avatar12' | 'avatar/icn_avatar13' | 'avatar/icn_avatar14' | 'avatar/icn_avatar15' | 'avatar/icn_avatar16' | 'avatar/icn_avatar17' | 'avatar/icn_avatar18' | 'avatar/icn_avatar19' | 'avatar/icn_avatar2' | 'avatar/icn_avatar20' | 'avatar/icn_avatar21' | 'avatar/icn_avatar22' | 'avatar/icn_avatar23' | 'avatar/icn_avatar3' | 'avatar/icn_avatar4' | 'avatar/icn_avatar5' | 'avatar/icn_avatar6' | 'avatar/icn_avatar7' | 'avatar/icn_avatar8' | 'avatar/icn_avatar9' | 'ban' | 'bar-chart-line' | 'bar-pencil' | 'battery-charging' | 'battery' | 'bell-plus' | 'bell-slash' | 'bell' | 'binoculars' | 'book' | 'bookmark' | 'broadcast' | 'browser/browser' | 'browser/chrome' | 'browser/edge' | 'browser/electron' | 'browser/facebook' | 'browser/firefox' | 'browser/ie' | 'browser/opera' | 'browser/safari' | 'buildings' | 'bullhorn' | 'calendar' | 'call' | 'camera-video-off' | 'camera-video' | 'camera' | 'card-list' | 'card-text' | 'caret-down-fill' | 'caret-right-fill' | 'chat-dots' | 'chat-left-text' | 'chat-square-quote' | 'check-circle-fill' | 'check-circle' | 'check' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'circle-fill' | 'circle' | 'click-hesitation' | 'click-rage' | 'clipboard-check' | 'clock-history' | 'clock' | 'close' | 'code' | 'cog' | 'cogs' | 'collection-play' | 'collection' | 'color/apple' | 'color/browser/chrome' | 'color/browser/edge' | 'color/browser/facebook' | 'color/browser/firefox' | 'color/browser/google' | 'color/browser/opera' | 'color/browser/safari' | 'color/browser/unknown' | 'color/browser/whale' | 'color/chrome' | 'color/country/de' | 'color/country/fr' | 'color/country/gb' | 'color/country/in' | 'color/country/us' | 'color/de' | 'color/device/desktop' | 'color/device/mobile' | 'color/device/tablet' | 'color/device/unkown' | 'color/edge' | 'color/fedora' | 'color/firefox' | 'color/fr' | 'color/gb' | 'color/in' | 'color/issues/bad_request' | 'color/issues/click_rage' | 'color/issues/cpu' | 'color/issues/crash' | 'color/issues/custom' | 'color/issues/dead_click' | 'color/issues/errors' | 'color/issues/excessive_scrolling' | 'color/issues/js_exception' | 'color/issues/memory' | 'color/issues/missing_resource' | 'color/issues/mouse_thrashing' | 'color/issues/slow_page_load' | 'color/microsoft' | 'color/opera' | 'color/os/android' | 'color/os/apple' | 'color/os/elementary' | 'color/os/fedora' | 'color/os/ios' | 'color/os/linux' | 'color/os/macos' | 'color/os/microsoft' | 'color/os/ubuntu' | 'color/os/unkown' | 'color/safari' | 'color/ubuntu' | 'color/us' | 'columns-gap' | 'console/error' | 'console/exception' | 'console/info' | 'console/warning' | 'console' | 'controller' | 'cookies' | 'copy' | 'credit-card-2-back' | 'cross' | 'cubes' | 'cursor-trash' | 'cypress' | 'dash' | 'dashboard-icn' | 'dashboards/circle-alert' | 'dashboards/cohort-chart' | 'dashboards/heatmap-2' | 'dashboards/user-journey' | 'db-icons/icn-card-clickMap' | 'db-icons/icn-card-errors' | 'db-icons/icn-card-funnel' | 'db-icons/icn-card-funnels' | 'db-icons/icn-card-insights' | 'db-icons/icn-card-library' | 'db-icons/icn-card-mapchart' | 'db-icons/icn-card-pathAnalysis' | 'db-icons/icn-card-performance' | 'db-icons/icn-card-resources' | 'db-icons/icn-card-table' | 'db-icons/icn-card-timeseries' | 'db-icons/icn-card-webVitals' | 'desktop' | 'device' | 'diagram-3' | 'dizzy' | 'door-closed' | 'download' | 'drag' | 'edit' | 'ellipsis-v' | 'emoji-dizzy' | 'enter' | 'envelope-check' | 'envelope-paper' | 'envelope-x' | 'envelope' | 'errors-icon' | 'event/click' | 'event/click_hesitation' | 'event/clickrage' | 'event/code' | 'event/i-cursor' | 'event/input' | 'event/input_hesitation' | 'event/link' | 'event/location' | 'event/mouse_thrashing' | 'event/resize' | 'event/view' | 'exclamation-circle-fill' | 'exclamation-circle' | 'exclamation-triangle' | 'explosion' | 'external-link-alt' | 'eye-slash-fill' | 'eye-slash' | 'eye' | 'fetch-request' | 'fetch' | 'fflag-multi' | 'fflag-single' | 'file-bar-graph' | 'file-code' | 'file-medical-alt' | 'file-pdf' | 'file' | 'files' | 'filetype-js' | 'filetype-pdf' | 'filter' | 'filters/arrow-return-right' | 'filters/browser' | 'filters/chevrons-up-down' | 'filters/click' | 'filters/clickrage' | 'filters/code' | 'filters/console' | 'filters/country' | 'filters/cpu-load' | 'filters/custom' | 'filters/device' | 'filters/dom-complete' | 'filters/duration' | 'filters/error' | 'filters/fetch-failed' | 'filters/fetch' | 'filters/file-code' | 'filters/graphql' | 'filters/i-cursor' | 'filters/input' | 'filters/lcpt' | 'filters/link' | 'filters/location' | 'filters/memory-load' | 'filters/metadata' | 'filters/os' | 'filters/perfromance-network-request' | 'filters/platform' | 'filters/referrer' | 'filters/resize' | 'filters/rev-id' | 'filters/screen' | 'filters/state-action' | 'filters/tag-element' | 'filters/ttfb' | 'filters/user-alt' | 'filters/userid' | 'filters/view' | 'flag-na' | 'folder-plus' | 'folder2' | 'fullscreen' | 'funnel/cpu-fill' | 'funnel/cpu' | 'funnel/dizzy' | 'funnel/emoji-angry-fill' | 'funnel/emoji-angry' | 'funnel/emoji-dizzy-fill' | 'funnel/exclamation-circle-fill' | 'funnel/exclamation-circle' | 'funnel/file-earmark-break-fill' | 'funnel/file-earmark-break' | 'funnel/file-earmark-minus-fill' | 'funnel/file-earmark-minus' | 'funnel/file-medical-alt' | 'funnel/file-x' | 'funnel/hdd-fill' | 'funnel/hourglass-top' | 'funnel/image-fill' | 'funnel/image' | 'funnel/microchip' | 'funnel/mouse' | 'funnel/patch-exclamation-fill' | 'funnel/sd-card' | 'funnel-fill' | 'funnel' | 'gear' | 'github' | 'graph-up' | 'grid-3x3' | 'grid-check' | 'grid' | 'hash' | 'headset' | 'history' | 'ic-errors' | 'ic-network' | 'ic-rage' | 'ic-resources' | 'icn_fetch-request' | 'icn_referrer' | 'icn_url' | 'id-card' | 'image' | 'info-circle-fill' | 'info-circle' | 'info-square' | 'info' | 'input-hesitation' | 'inspect' | 'integrations/assist' | 'integrations/bugsnag-text' | 'integrations/bugsnag' | 'integrations/cloudwatch-text' | 'integrations/cloudwatch' | 'integrations/datadog' | 'integrations/dynatrace' | 'integrations/elasticsearch-text' | 'integrations/elasticsearch' | 'integrations/github' | 'integrations/graphql' | 'integrations/jira-text' | 'integrations/jira' | 'integrations/mobx' | 'integrations/newrelic-text' | 'integrations/newrelic' | 'integrations/ngrx' | 'integrations/openreplay-text' | 'integrations/openreplay' | 'integrations/redux' | 'integrations/rollbar-text' | 'integrations/rollbar' | 'integrations/segment' | 'integrations/sentry-text' | 'integrations/sentry' | 'integrations/slack-bw' | 'integrations/slack' | 'integrations/stackdriver' | 'integrations/sumologic-text' | 'integrations/sumologic' | 'integrations/teams-white' | 'integrations/teams' | 'integrations/vuejs' | 'integrations/zustand' | 'journal-code' | 'kai' | 'kai_colored' | 'key' | 'keyboard' | 'layers-half' | 'lightbulb-on' | 'lightbulb' | 'link-45deg' | 'list-alt' | 'list-ul' | 'list' | 'low-disc-space' | 'magic' | 'map-marker-alt' | 'memory-ios' | 'memory' | 'metadata-more' | 'mic-mute' | 'mic' | 'minus' | 'mobile' | 'mouse-alt' | 'mouse-pointer-click' | 'network' | 'next1' | 'no-dashboard' | 'no-metrics-chart' | 'no-metrics' | 'no-recordings' | 'orIcn' | 'orSpot' | 'orspotOutline' | 'os/android' | 'os/chrome_os' | 'os/fedora' | 'os/ios' | 'os/linux' | 'os/mac_os_x' | 'os/other' | 'os/ubuntu' | 'os/windows' | 'os' | 'pause-circle-fill' | 'pause-fill' | 'pause' | 'pdf-download' | 'pencil-stop' | 'pencil' | 'people' | 'percent' | 'performance-icon' | 'person-border' | 'person-fill' | 'person' | 'pie-chart-fill' | 'pin-fill' | 'play-circle-bold' | 'play-circle-light' | 'play-circle' | 'play-fill-new' | 'play-fill' | 'play-hover' | 'play' | 'plug' | 'plus-circle' | 'plus' | 'prev1' | 'pulse' | 'puppeteer' | 'puzzle-piece' | 'puzzle' | 'pwright' | 'question-circle' | 'question-lg' | 'quotes' | 'record-circle-fill' | 'record-circle' | 'record2' | 'redo' | 'redux' | 'referrer' | 'remote-control' | 'resources-icon' | 'safe' | 'sandglass' | 'search' | 'server' | 'share-alt' | 'shield-lock' | 'side_menu_closed' | 'side_menu_open' | 'signpost-split' | 'signup' | 'slack' | 'slash-circle' | 'sleep' | 'sliders' | 'social/slack' | 'social/trello' | 'sparkles' | 'speedometer2' | 'spinner' | 'square-mouse-pointer' | 'star' | 'step-forward' | 'stickies' | 'stop-record-circle' | 'stopwatch' | 'store' | 'sync-alt' | 'table' | 'tags' | 'terminal' | 'thermometer-sun' | 'toggles' | 'tools' | 'trash' | 'turtle' | 'user-alt' | 'user-circle' | 'user-friends' | 'user-journey' | 'user-switch' | 'users' | 'vendors/graphql' | 'web-vitals' | 'wifi' | 'window-x' | 'window' | 'zoom-in'; +export type IconNames = 'activity' | 'analytics' | 'anchor' | 'arrow-bar-left' | 'arrow-clockwise' | 'arrow-counterclockwise' | 'arrow-down-short' | 'arrow-down-up' | 'arrow-down' | 'arrow-repeat' | 'arrow-right-short' | 'arrow-up-short' | 'arrow-up' | 'avatar/icn_avatar1' | 'avatar/icn_avatar10' | 'avatar/icn_avatar11' | 'avatar/icn_avatar12' | 'avatar/icn_avatar13' | 'avatar/icn_avatar14' | 'avatar/icn_avatar15' | 'avatar/icn_avatar16' | 'avatar/icn_avatar17' | 'avatar/icn_avatar18' | 'avatar/icn_avatar19' | 'avatar/icn_avatar2' | 'avatar/icn_avatar20' | 'avatar/icn_avatar21' | 'avatar/icn_avatar22' | 'avatar/icn_avatar23' | 'avatar/icn_avatar3' | 'avatar/icn_avatar4' | 'avatar/icn_avatar5' | 'avatar/icn_avatar6' | 'avatar/icn_avatar7' | 'avatar/icn_avatar8' | 'avatar/icn_avatar9' | 'ban' | 'bar-chart-line' | 'bar-pencil' | 'battery-charging' | 'battery' | 'bell-plus' | 'bell-slash' | 'bell' | 'binoculars' | 'book' | 'bookmark' | 'broadcast' | 'browser/browser' | 'browser/chrome' | 'browser/edge' | 'browser/electron' | 'browser/facebook' | 'browser/firefox' | 'browser/ie' | 'browser/opera' | 'browser/safari' | 'buildings' | 'bullhorn' | 'calendar' | 'call' | 'camera-video-off' | 'camera-video' | 'camera' | 'card-list' | 'card-text' | 'caret-down-fill' | 'caret-right-fill' | 'chat-dots' | 'chat-left-text' | 'chat-square-quote' | 'check-circle-fill' | 'check-circle' | 'check' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'circle-fill' | 'circle' | 'click-hesitation' | 'click-rage' | 'clipboard-check' | 'clock-history' | 'clock' | 'close' | 'code' | 'cog' | 'cogs' | 'collection-play' | 'collection' | 'color/apple' | 'color/browser/chrome' | 'color/browser/edge' | 'color/browser/facebook' | 'color/browser/firefox' | 'color/browser/google' | 'color/browser/opera' | 'color/browser/safari' | 'color/browser/unknown' | 'color/browser/whale' | 'color/chrome' | 'color/country/de' | 'color/country/fr' | 'color/country/gb' | 'color/country/in' | 'color/country/us' | 'color/de' | 'color/device/desktop' | 'color/device/mobile' | 'color/device/tablet' | 'color/device/unkown' | 'color/edge' | 'color/fedora' | 'color/firefox' | 'color/fr' | 'color/gb' | 'color/in' | 'color/issues/bad_request' | 'color/issues/click_rage' | 'color/issues/cpu' | 'color/issues/crash' | 'color/issues/custom' | 'color/issues/dead_click' | 'color/issues/errors' | 'color/issues/excessive_scrolling' | 'color/issues/js_exception' | 'color/issues/memory' | 'color/issues/missing_resource' | 'color/issues/mouse_thrashing' | 'color/issues/slow_page_load' | 'color/microsoft' | 'color/opera' | 'color/os/android' | 'color/os/apple' | 'color/os/elementary' | 'color/os/fedora' | 'color/os/ios' | 'color/os/linux' | 'color/os/macos' | 'color/os/microsoft' | 'color/os/ubuntu' | 'color/os/unkown' | 'color/safari' | 'color/ubuntu' | 'color/us' | 'columns-gap' | 'console/error' | 'console/exception' | 'console/info' | 'console/warning' | 'console' | 'controller' | 'cookies' | 'copy' | 'credit-card-2-back' | 'cross' | 'cubes' | 'cursor-trash' | 'cypress' | 'dash' | 'dashboard-icn' | 'dashboards/circle-alert' | 'dashboards/cohort-chart' | 'dashboards/heatmap-2' | 'dashboards/user-journey' | 'db-icons/icn-card-clickMap' | 'db-icons/icn-card-errors' | 'db-icons/icn-card-funnel' | 'db-icons/icn-card-funnels' | 'db-icons/icn-card-insights' | 'db-icons/icn-card-library' | 'db-icons/icn-card-mapchart' | 'db-icons/icn-card-pathAnalysis' | 'db-icons/icn-card-performance' | 'db-icons/icn-card-resources' | 'db-icons/icn-card-table' | 'db-icons/icn-card-timeseries' | 'db-icons/icn-card-webVitals' | 'desktop' | 'device' | 'diagram-3' | 'dizzy' | 'door-closed' | 'download' | 'drag' | 'edit' | 'ellipsis-v' | 'emoji-dizzy' | 'enter' | 'envelope-check' | 'envelope-paper' | 'envelope-x' | 'envelope' | 'errors-icon' | 'event/click' | 'event/click_hesitation' | 'event/clickrage' | 'event/code' | 'event/i-cursor' | 'event/input' | 'event/input_hesitation' | 'event/link' | 'event/location' | 'event/mouse_thrashing' | 'event/resize' | 'event/view' | 'exclamation-circle-fill' | 'exclamation-circle' | 'exclamation-triangle' | 'explosion' | 'external-link-alt' | 'eye-slash-fill' | 'eye-slash' | 'eye' | 'fetch-request' | 'fetch' | 'fflag-multi' | 'fflag-single' | 'file-bar-graph' | 'file-code' | 'file-medical-alt' | 'file-pdf' | 'file' | 'files' | 'filetype-js' | 'filetype-pdf' | 'filter' | 'filters/arrow-return-right' | 'filters/browser' | 'filters/chevrons-up-down' | 'filters/click' | 'filters/clickrage' | 'filters/code' | 'filters/console' | 'filters/country' | 'filters/cpu-load' | 'filters/custom' | 'filters/device' | 'filters/dom-complete' | 'filters/duration' | 'filters/error' | 'filters/fetch-failed' | 'filters/fetch' | 'filters/file-code' | 'filters/graphql' | 'filters/i-cursor' | 'filters/input' | 'filters/lcpt' | 'filters/link' | 'filters/location' | 'filters/memory-load' | 'filters/metadata' | 'filters/os' | 'filters/perfromance-network-request' | 'filters/platform' | 'filters/referrer' | 'filters/resize' | 'filters/rev-id' | 'filters/screen' | 'filters/state-action' | 'filters/tag-element' | 'filters/ttfb' | 'filters/user-alt' | 'filters/userid' | 'filters/view' | 'flag-na' | 'folder-plus' | 'folder2' | 'fullscreen' | 'funnel/cpu-fill' | 'funnel/cpu' | 'funnel/dizzy' | 'funnel/emoji-angry-fill' | 'funnel/emoji-angry' | 'funnel/emoji-dizzy-fill' | 'funnel/exclamation-circle-fill' | 'funnel/exclamation-circle' | 'funnel/file-earmark-break-fill' | 'funnel/file-earmark-break' | 'funnel/file-earmark-minus-fill' | 'funnel/file-earmark-minus' | 'funnel/file-medical-alt' | 'funnel/file-x' | 'funnel/hdd-fill' | 'funnel/hourglass-top' | 'funnel/image-fill' | 'funnel/image' | 'funnel/microchip' | 'funnel/mouse' | 'funnel/patch-exclamation-fill' | 'funnel/sd-card' | 'funnel-fill' | 'funnel' | 'gear' | 'github' | 'graph-up' | 'grid-3x3' | 'grid-check' | 'grid' | 'hash' | 'headset' | 'history' | 'ic-errors' | 'ic-network' | 'ic-rage' | 'ic-resources' | 'icn_fetch-request' | 'icn_referrer' | 'icn_url' | 'id-card' | 'image' | 'info-circle-fill' | 'info-circle' | 'info-square' | 'info' | 'input-hesitation' | 'inspect' | 'integrations/assist' | 'integrations/bugsnag-text' | 'integrations/bugsnag' | 'integrations/cloudwatch-text' | 'integrations/cloudwatch' | 'integrations/datadog' | 'integrations/dynatrace' | 'integrations/elasticsearch-text' | 'integrations/elasticsearch' | 'integrations/github' | 'integrations/graphql' | 'integrations/jira-text' | 'integrations/jira' | 'integrations/mobx' | 'integrations/newrelic-text' | 'integrations/newrelic' | 'integrations/ngrx' | 'integrations/openreplay-text' | 'integrations/openreplay' | 'integrations/redux' | 'integrations/rollbar-text' | 'integrations/rollbar' | 'integrations/segment' | 'integrations/sentry-text' | 'integrations/sentry' | 'integrations/slack-bw' | 'integrations/slack' | 'integrations/stackdriver' | 'integrations/sumologic-text' | 'integrations/sumologic' | 'integrations/teams-white' | 'integrations/teams' | 'integrations/vuejs' | 'integrations/zustand' | 'journal-code' | 'kai-mono' | 'kai' | 'kai_colored' | 'key' | 'keyboard' | 'layers-half' | 'lightbulb-on' | 'lightbulb' | 'link-45deg' | 'list-alt' | 'list-ul' | 'list' | 'low-disc-space' | 'magic' | 'map-marker-alt' | 'memory-ios' | 'memory' | 'metadata-more' | 'mic-mute' | 'mic' | 'minus' | 'mobile' | 'mouse-alt' | 'mouse-pointer-click' | 'network' | 'next1' | 'no-dashboard' | 'no-metrics-chart' | 'no-metrics' | 'no-recordings' | 'orIcn' | 'orSpot' | 'orspotOutline' | 'os/android' | 'os/chrome_os' | 'os/fedora' | 'os/ios' | 'os/linux' | 'os/mac_os_x' | 'os/other' | 'os/ubuntu' | 'os/windows' | 'os' | 'pause-circle-fill' | 'pause-fill' | 'pause' | 'pdf-download' | 'pencil-stop' | 'pencil' | 'people' | 'percent' | 'performance-icon' | 'person-border' | 'person-fill' | 'person' | 'pie-chart-fill' | 'pin-fill' | 'play-circle-bold' | 'play-circle-light' | 'play-circle' | 'play-fill-new' | 'play-fill' | 'play-hover' | 'play' | 'plug' | 'plus-circle' | 'plus' | 'prev1' | 'pulse' | 'puppeteer' | 'puzzle-piece' | 'puzzle' | 'pwright' | 'question-circle' | 'question-lg' | 'quotes' | 'record-circle-fill' | 'record-circle' | 'record2' | 'redo' | 'redux' | 'referrer' | 'remote-control' | 'resources-icon' | 'safe' | 'sandglass' | 'search' | 'server' | 'share-alt' | 'shield-lock' | 'side_menu_closed' | 'side_menu_open' | 'signpost-split' | 'signup' | 'slack' | 'slash-circle' | 'sleep' | 'sliders' | 'social/slack' | 'social/trello' | 'sparkles' | 'speedometer2' | 'spinner' | 'square-mouse-pointer' | 'star' | 'step-forward' | 'stickies' | 'stop-record-circle' | 'stopwatch' | 'store' | 'sync-alt' | 'table' | 'tags' | 'terminal' | 'thermometer-sun' | 'toggles' | 'tools' | 'trash' | 'turtle' | 'user-alt' | 'user-circle' | 'user-friends' | 'user-journey' | 'user-switch' | 'users' | 'vendors/graphql' | 'web-vitals' | 'wifi' | 'window-x' | 'window' | 'zoom-in'; interface Props { name: IconNames; @@ -1561,6 +1562,9 @@ const SVG = (props: Props) => { // case 'journal-code': case 'journal-code': return ; + // case 'kai-mono': + case 'kai-mono': return ; + case 'kai': return ; diff --git a/frontend/app/svg/icons/kai-mono.svg b/frontend/app/svg/icons/kai-mono.svg new file mode 100644 index 000000000..97738455d --- /dev/null +++ b/frontend/app/svg/icons/kai-mono.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + From 0a1633d6239df4f094483a408df5de12787156e9 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Tue, 27 May 2025 17:58:10 +0200 Subject: [PATCH 33/67] ui: fixes to kai msg max size --- frontend/app/components/Kai/components/ChatMsg.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/app/components/Kai/components/ChatMsg.tsx b/frontend/app/components/Kai/components/ChatMsg.tsx index 5239f9745..aa3c1736c 100644 --- a/frontend/app/components/Kai/components/ChatMsg.tsx +++ b/frontend/app/components/Kai/components/ChatMsg.tsx @@ -163,13 +163,17 @@ function ChatMsg({ const metricData = metric?.data; React.useEffect(() => { - if (!chart_data && metricData && metricData.values.length > 0) { - kaiStore.saveLatestChart(messageId, siteId); + if (!chart_data && metricData) { + const hasValues = + metricData.values?.length > 0 || metricData.chart?.length > 0; + if (hasValues) { + kaiStore.saveLatestChart(messageId, siteId); + } } }, [metricData, chart_data]); return (
-
+
Date: Tue, 27 May 2025 14:38:27 +0200 Subject: [PATCH 34/67] refactor(DB): support incident events --- .../schema/db/init_dbs/clickhouse/create/init_schema.sql | 3 ++- .../schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql | 2 ++ ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql | 3 ++- scripts/schema/db/init_dbs/clickhouse/1.23.0/1.23.0.sql | 9 ++++++--- scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql | 2 ++ scripts/schema/db/init_dbs/postgresql/init_schema.sql | 3 ++- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/ee/scripts/schema/db/init_dbs/clickhouse/create/init_schema.sql b/ee/scripts/schema/db/init_dbs/clickhouse/create/init_schema.sql index 7d1a9559a..71bd6ad55 100644 --- a/ee/scripts/schema/db/init_dbs/clickhouse/create/init_schema.sql +++ b/ee/scripts/schema/db/init_dbs/clickhouse/create/init_schema.sql @@ -791,7 +791,8 @@ CREATE TABLE IF NOT EXISTS product_analytics.property_values_samples ENGINE = ReplacingMergeTree(_timestamp) ORDER BY (project_id, property_name, is_event_property); -- Incremental materialized view to get random examples of property values using $properties & properties -CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.property_values_sampler_mvREFRESHEVERY30HOURTOproduct_analytics.property_values_samples AS +CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.property_values_sampler_mv + REFRESH EVERY 30 HOUR TO product_analytics.property_values_samples AS SELECT project_id, property_name, TRUE AS is_event_property, diff --git a/ee/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql b/ee/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql index 718a6e693..9c878f57a 100644 --- a/ee/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql +++ b/ee/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql @@ -23,6 +23,8 @@ DROP SCHEMA IF EXISTS or_cache CASCADE; ALTER TABLE public.tenants ALTER COLUMN scope_state SET DEFAULT 2; +ALTER TYPE issue_type ADD VALUE IF NOT EXISTS 'incident'; + COMMIT; \elif :is_next diff --git a/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql b/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql index 4701bc53f..caf4e7467 100644 --- a/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql +++ b/ee/scripts/schema/db/init_dbs/postgresql/init_schema.sql @@ -352,7 +352,8 @@ CREATE TYPE issue_type AS ENUM ( 'custom', 'js_exception', 'mouse_thrashing', - 'app_crash' + 'app_crash', + 'incident' ); CREATE TABLE public.issues diff --git a/scripts/schema/db/init_dbs/clickhouse/1.23.0/1.23.0.sql b/scripts/schema/db/init_dbs/clickhouse/1.23.0/1.23.0.sql index 50dd204bb..baef5f007 100644 --- a/scripts/schema/db/init_dbs/clickhouse/1.23.0/1.23.0.sql +++ b/scripts/schema/db/init_dbs/clickhouse/1.23.0/1.23.0.sql @@ -168,7 +168,8 @@ CREATE TABLE IF NOT EXISTS product_analytics.property_values_samples ENGINE = ReplacingMergeTree(_timestamp) ORDER BY (project_id, property_name, is_event_property); -CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.property_values_sampler_mvREFRESHEVERY30HOURTOproduct_analytics.property_values_samples AS +CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.property_values_sampler_mv + REFRESH EVERY 30 HOUR TO product_analytics.property_values_samples AS SELECT project_id, property_name, TRUE AS is_event_property, @@ -219,7 +220,8 @@ CREATE TABLE IF NOT EXISTS product_analytics.autocomplete_events_grouped ORDER BY (project_id, value) TTL _timestamp + INTERVAL 1 MONTH; -CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.autocomplete_events_grouped_mvREFRESHEVERY30MINUTETOproduct_analytics.autocomplete_events_grouped AS +CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.autocomplete_events_grouped_mv + REFRESH EVERY 30 MINUTE TO product_analytics.autocomplete_events_grouped AS SELECT project_id, value, count(1) AS data_count, @@ -265,7 +267,8 @@ CREATE TABLE IF NOT EXISTS product_analytics.autocomplete_event_properties_group ORDER BY (project_id, event_name, property_name, value) TTL _timestamp + INTERVAL 1 MONTH; -CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.autocomplete_event_properties_grouped_mvREFRESHEVERY30MINUTETOproduct_analytics.autocomplete_event_properties_grouped AS +CREATE MATERIALIZED VIEW IF NOT EXISTS product_analytics.autocomplete_event_properties_grouped_mv + REFRESH EVERY 30 MINUTE TO product_analytics.autocomplete_event_properties_grouped AS SELECT project_id, event_name, property_name, diff --git a/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql b/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql index 8003f6753..36f9e8d6d 100644 --- a/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql +++ b/scripts/schema/db/init_dbs/postgresql/1.23.0/1.23.0.sql @@ -23,6 +23,8 @@ DROP SCHEMA IF EXISTS or_cache CASCADE; ALTER TABLE public.tenants ALTER COLUMN scope_state SET DEFAULT 2; +ALTER TYPE issue_type ADD VALUE IF NOT EXISTS 'incident'; + COMMIT; \elif :is_next diff --git a/scripts/schema/db/init_dbs/postgresql/init_schema.sql b/scripts/schema/db/init_dbs/postgresql/init_schema.sql index 7c6eb396e..2df44883a 100644 --- a/scripts/schema/db/init_dbs/postgresql/init_schema.sql +++ b/scripts/schema/db/init_dbs/postgresql/init_schema.sql @@ -314,7 +314,8 @@ CREATE TYPE issue_type AS ENUM ( 'custom', 'js_exception', 'mouse_thrashing', - 'app_crash' + 'app_crash', + 'incident' ); CREATE TABLE public.issues From 697bf9d0859225b0e67d2d435614c164e66a12db Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Tue, 27 May 2025 15:37:53 +0200 Subject: [PATCH 35/67] fix(chalice): fixed autocomplete --- api/chalicelib/core/events/events_pg.py | 2 +- api/routers/core.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/api/chalicelib/core/events/events_pg.py b/api/chalicelib/core/events/events_pg.py index 06b524f51..d8bba29d5 100644 --- a/api/chalicelib/core/events/events_pg.py +++ b/api/chalicelib/core/events/events_pg.py @@ -131,7 +131,7 @@ def supported_types(): query=autocomplete.__generic_query( typename=schemas.EventType.GRAPHQL)), schemas.EventType.STATE_ACTION: SupportedFilter( - get=autocomplete.__generic_autocomplete(schemas.EventType.STATEACTION), + get=autocomplete.__generic_autocomplete(schemas.EventType.STATE_ACTION), query=autocomplete.__generic_query( typename=schemas.EventType.STATE_ACTION)), schemas.EventType.TAG: SupportedFilter(get=_search_tags, query=None), diff --git a/api/routers/core.py b/api/routers/core.py index 260df30f2..a79cb9245 100644 --- a/api/routers/core.py +++ b/api/routers/core.py @@ -4,8 +4,9 @@ from decouple import config from fastapi import Depends, Body, BackgroundTasks import schemas -from chalicelib.core import events, projects, metadata, reset_password, log_tools, \ +from chalicelib.core import projects, metadata, reset_password, log_tools, \ announcements, weekly_report, assist, mobile, tenants, boarding, notifications, webhook, users, saved_search, tags +from chalicelib.core.events import events from chalicelib.core.issues import issues from chalicelib.core.sourcemaps import sourcemaps from chalicelib.core.metrics import custom_metrics From acedff8a7a5d4ab9accae722a8b4c12f54e9d1c9 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 28 May 2025 11:45:46 +0200 Subject: [PATCH 36/67] feat(db): [OR-2118] insert screen_width, screen_height to CH --- backend/pkg/db/clickhouse/connector.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/pkg/db/clickhouse/connector.go b/backend/pkg/db/clickhouse/connector.go index c35f67fda..476ae84ed 100644 --- a/backend/pkg/db/clickhouse/connector.go +++ b/backend/pkg/db/clickhouse/connector.go @@ -106,7 +106,7 @@ func (c *connectorImpl) newBatch(name, query string) error { } var batches = map[string]string{ - "sessions": "INSERT INTO experimental.sessions (session_id, project_id, user_id, user_uuid, user_os, user_os_version, user_device, user_device_type, user_country, user_state, user_city, datetime, duration, pages_count, events_count, errors_count, issue_score, referrer, issue_types, tracker_version, user_browser, user_browser_version, metadata_1, metadata_2, metadata_3, metadata_4, metadata_5, metadata_6, metadata_7, metadata_8, metadata_9, metadata_10, platform, timezone, utm_source, utm_medium, utm_campaign) VALUES (?, ?, SUBSTR(?, 1, 8000), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SUBSTR(?, 1, 8000), ?, ?, ?, ?, SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), ?, ?, ?, ?, ?)", + "sessions": "INSERT INTO experimental.sessions (session_id, project_id, user_id, user_uuid, user_os, user_os_version, user_device, user_device_type, user_country, user_state, user_city, datetime, duration, pages_count, events_count, errors_count, issue_score, referrer, issue_types, tracker_version, user_browser, user_browser_version, metadata_1, metadata_2, metadata_3, metadata_4, metadata_5, metadata_6, metadata_7, metadata_8, metadata_9, metadata_10, platform, timezone, utm_source, utm_medium, utm_campaign, screen_width, screen_height) VALUES (?, ?, SUBSTR(?, 1, 8000), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SUBSTR(?, 1, 8000), ?, ?, ?, ?, SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), SUBSTR(?, 1, 8000), ?, ?, ?, ?, ?, ?, ?)", "autocompletes": "INSERT INTO experimental.autocomplete (project_id, type, value) VALUES (?, ?, SUBSTR(?, 1, 8000))", "pages": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, "clicks": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, @@ -220,6 +220,8 @@ func (c *connectorImpl) InsertWebSession(session *sessions.Session) error { session.UtmSource, session.UtmMedium, session.UtmCampaign, + session.ScreenWidth, + session.ScreenHeight, ); err != nil { c.checkError("sessions", err) return fmt.Errorf("can't append to sessions batch: %s", err) From a8d0de4e984d407b5c1e10026f63d3493e6fdf46 Mon Sep 17 00:00:00 2001 From: rjshrjndrn Date: Wed, 28 May 2025 12:05:01 +0200 Subject: [PATCH 37/67] chore(action): fix helm template Signed-off-by: rjshrjndrn --- .github/workflows/alerts-ee.yaml | 2 +- .github/workflows/alerts.yaml | 2 +- .github/workflows/api-ee.yaml | 2 +- .github/workflows/api.yaml | 2 +- .github/workflows/assist-ee.yaml | 2 +- .github/workflows/assist-server-ee.yaml | 2 +- .github/workflows/assist-stats.yaml | 2 +- .github/workflows/assist.yaml | 2 +- .github/workflows/crons-ee.yaml | 2 +- .github/workflows/frontend-dev.yaml | 2 +- .github/workflows/frontend.yaml | 4 ++-- .github/workflows/sourcemaps-reader-ee.yaml | 2 +- .github/workflows/sourcemaps-reader.yaml | 2 +- .github/workflows/workers-ee.yaml | 4 +--- .github/workflows/workers.yaml | 4 +--- 15 files changed, 16 insertions(+), 20 deletions(-) diff --git a/.github/workflows/alerts-ee.yaml b/.github/workflows/alerts-ee.yaml index 1df316c3e..ad7201b2f 100644 --- a/.github/workflows/alerts-ee.yaml +++ b/.github/workflows/alerts-ee.yaml @@ -130,7 +130,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,alerts,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,alerts,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/alerts.yaml b/.github/workflows/alerts.yaml index c5d268648..7fb6e6742 100644 --- a/.github/workflows/alerts.yaml +++ b/.github/workflows/alerts.yaml @@ -130,7 +130,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,alerts,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,alerts,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/api-ee.yaml b/.github/workflows/api-ee.yaml index ad2250e24..f93b0d873 100644 --- a/.github/workflows/api-ee.yaml +++ b/.github/workflows/api-ee.yaml @@ -127,7 +127,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,chalice,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,chalice,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/api.yaml b/.github/workflows/api.yaml index 4dbbfadb0..537510ce4 100644 --- a/.github/workflows/api.yaml +++ b/.github/workflows/api.yaml @@ -120,7 +120,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,chalice,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,chalice,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/assist-ee.yaml b/.github/workflows/assist-ee.yaml index 808646328..c10b22939 100644 --- a/.github/workflows/assist-ee.yaml +++ b/.github/workflows/assist-ee.yaml @@ -113,7 +113,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,assist,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,assist,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/assist-server-ee.yaml b/.github/workflows/assist-server-ee.yaml index 62f857f9d..39401f5d2 100644 --- a/.github/workflows/assist-server-ee.yaml +++ b/.github/workflows/assist-server-ee.yaml @@ -111,7 +111,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,assist-server,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,assist-server,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/assist-stats.yaml b/.github/workflows/assist-stats.yaml index f76861237..5323d13da 100644 --- a/.github/workflows/assist-stats.yaml +++ b/.github/workflows/assist-stats.yaml @@ -130,7 +130,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,assist-stats,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,assist-stats,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -f - diff --git a/.github/workflows/assist.yaml b/.github/workflows/assist.yaml index 4c8a454b7..970ceb3c1 100644 --- a/.github/workflows/assist.yaml +++ b/.github/workflows/assist.yaml @@ -112,7 +112,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,assist,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,assist,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/crons-ee.yaml b/.github/workflows/crons-ee.yaml index 56bf97b2c..7c46049c5 100644 --- a/.github/workflows/crons-ee.yaml +++ b/.github/workflows/crons-ee.yaml @@ -129,7 +129,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,utilities,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,utilities,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks --kube-version=$k_version | kubectl apply -f - diff --git a/.github/workflows/frontend-dev.yaml b/.github/workflows/frontend-dev.yaml index 548ed2537..446164ba6 100644 --- a/.github/workflows/frontend-dev.yaml +++ b/.github/workflows/frontend-dev.yaml @@ -76,7 +76,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/frontend.yaml b/.github/workflows/frontend.yaml index 1dc69c580..25e68c0c8 100644 --- a/.github/workflows/frontend.yaml +++ b/.github/workflows/frontend.yaml @@ -89,7 +89,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - @@ -138,7 +138,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,frontend,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/sourcemaps-reader-ee.yaml b/.github/workflows/sourcemaps-reader-ee.yaml index 459762c69..0822f4b32 100644 --- a/.github/workflows/sourcemaps-reader-ee.yaml +++ b/.github/workflows/sourcemaps-reader-ee.yaml @@ -119,7 +119,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,sourcemapreader,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,sourcemapreader,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/sourcemaps-reader.yaml b/.github/workflows/sourcemaps-reader.yaml index a05dfaeb2..b6a8ea79b 100644 --- a/.github/workflows/sourcemaps-reader.yaml +++ b/.github/workflows/sourcemaps-reader.yaml @@ -118,7 +118,7 @@ jobs: cat /tmp/image_override.yaml # Deploy command mkdir -p /tmp/charts - mv openreplay/charts/{ingress-nginx,sourcemapreader,quickwit,connector} /tmp/charts/ + mv openreplay/charts/{ingress-nginx,sourcemapreader,quickwit,connector,assist-api} /tmp/charts/ rm -rf openreplay/charts/* mv /tmp/charts/* openreplay/charts/ helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true --no-hooks | kubectl apply -n app -f - diff --git a/.github/workflows/workers-ee.yaml b/.github/workflows/workers-ee.yaml index 5ed1039b2..5c8951f75 100644 --- a/.github/workflows/workers-ee.yaml +++ b/.github/workflows/workers-ee.yaml @@ -148,9 +148,7 @@ jobs: set -x echo > /tmp/image_override.yaml mkdir /tmp/helmcharts - mv openreplay/charts/ingress-nginx /tmp/helmcharts/ - mv openreplay/charts/quickwit /tmp/helmcharts/ - mv openreplay/charts/connector /tmp/helmcharts/ + mv openreplay/charts/{ingress-nginx,quickwit,connector,assist-api} /tmp/helmcharts/ ## Update images for image in $(cat /tmp/images_to_build.txt); do diff --git a/.github/workflows/workers.yaml b/.github/workflows/workers.yaml index ceb4e0f43..0e1c4c341 100644 --- a/.github/workflows/workers.yaml +++ b/.github/workflows/workers.yaml @@ -141,9 +141,7 @@ jobs: set -x echo > /tmp/image_override.yaml mkdir /tmp/helmcharts - mv openreplay/charts/ingress-nginx /tmp/helmcharts/ - mv openreplay/charts/quickwit /tmp/helmcharts/ - mv openreplay/charts/connector /tmp/helmcharts/ + mv openreplay/charts/{ingress-nginx,quickwit,connector,assist-api} /tmp/helmcharts/ ## Update images for image in $(cat /tmp/images_to_build.txt); do From 3460a65b793d27a443986e0dfb7b522bd96a8440 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Wed, 28 May 2025 13:59:05 +0200 Subject: [PATCH 38/67] ui: some design fixes for kai --- frontend/app/components/Kai/KaiChat.tsx | 11 +++- .../components/Kai/components/ChatHeader.tsx | 2 +- .../components/Kai/components/ChatInput.tsx | 6 +- .../app/components/Kai/components/ChatLog.tsx | 5 +- .../app/components/Kai/components/ChatMsg.tsx | 56 +++++++++---------- .../components/Kai/components/ChatsModal.tsx | 23 ++++++-- .../app/components/Kai/components/Ideas.tsx | 4 +- .../components/ui/CopyButton/CopyButton.tsx | 25 +++++---- .../app/components/ui/Icons/export_pdf.tsx | 18 ++++++ frontend/app/components/ui/Icons/index.ts | 1 + frontend/app/components/ui/SVG.tsx | 6 +- frontend/app/styles/global.css | 5 ++ frontend/app/svg/icons/export-pdf.svg | 7 +++ 13 files changed, 113 insertions(+), 56 deletions(-) create mode 100644 frontend/app/components/ui/Icons/export_pdf.tsx create mode 100644 frontend/app/svg/icons/export-pdf.svg diff --git a/frontend/app/components/Kai/KaiChat.tsx b/frontend/app/components/Kai/KaiChat.tsx index 4d3d13586..dfc504ef7 100644 --- a/frontend/app/components/Kai/KaiChat.tsx +++ b/frontend/app/components/Kai/KaiChat.tsx @@ -38,6 +38,7 @@ function KaiChat() { showModal( { setTitle(title); setThreadId(threadId); @@ -118,7 +119,9 @@ function KaiChat() { style={{ maxWidth: PANEL_SIZES.maxWidth }} >
-
+
OpenReplay AI can make mistakes. Verify its outputs.
diff --git a/frontend/app/components/Kai/components/ChatHeader.tsx b/frontend/app/components/Kai/components/ChatHeader.tsx index 29aaa4365..adcf7e0de 100644 --- a/frontend/app/components/Kai/components/ChatHeader.tsx +++ b/frontend/app/components/Kai/components/ChatHeader.tsx @@ -49,7 +49,7 @@ function ChatHeader({
{goBack ? (
onCreate()} className="font-semibold w-fit cursor-pointer hover:text-main flex items-center gap-2" > diff --git a/frontend/app/components/Kai/components/ChatInput.tsx b/frontend/app/components/Kai/components/ChatInput.tsx index b860c4c32..9e6e0f1c2 100644 --- a/frontend/app/components/Kai/components/ChatInput.tsx +++ b/frontend/app/components/Kai/components/ChatInput.tsx @@ -101,7 +101,7 @@ function ChatInput({ + ) : null} + bodyRef.current?.innerHTML} + content={text} + isIcon + format={'text/html'} + />
) : (
@@ -238,14 +234,14 @@ function ChatMsg({ tooltip="Like this answer" onClick={() => onFeedback('like', messageId)} > - + onFeedback('dislike', messageId)} > - + {supports_visualization ? ( - + ) : null} - +
)} diff --git a/frontend/app/components/Kai/components/ChatsModal.tsx b/frontend/app/components/Kai/components/ChatsModal.tsx index 8fb279aea..6a8c37753 100644 --- a/frontend/app/components/Kai/components/ChatsModal.tsx +++ b/frontend/app/components/Kai/components/ChatsModal.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { splitByDate } from '../utils'; import { useQuery } from '@tanstack/react-query'; -import { MessagesSquare, Trash } from 'lucide-react'; +import { MessagesSquare, Trash, X } from 'lucide-react'; import { kaiService } from 'App/services'; import { toast } from 'react-toastify'; import { useTranslation } from 'react-i18next'; @@ -11,9 +11,11 @@ import { observer } from 'mobx-react-lite'; function ChatsModal({ onSelect, projectId, + onHide, }: { onSelect: (threadId: string, title: string) => void; projectId: string; + onHide: () => void; }) { const { t } = useTranslation(); const { usage } = kaiStore; @@ -45,12 +47,21 @@ function ChatsModal({ }; return (
{t('Previous Chats')} +
+
+ +
{usage.percent > 80 ? (
@@ -65,7 +76,7 @@ function ChatsModal({ {t('Loading chats')}...
) : ( -
+
{datedCollections.map((col, i) => ( -
{date}
+
+
{date}
); diff --git a/frontend/app/components/Kai/components/Ideas.tsx b/frontend/app/components/Kai/components/Ideas.tsx index bade87acb..11c3d5418 100644 --- a/frontend/app/components/Kai/components/Ideas.tsx +++ b/frontend/app/components/Kai/components/Ideas.tsx @@ -8,10 +8,12 @@ function Ideas({ onClick, projectId, threadId = null, + inChat, }: { onClick: (query: string) => void; projectId: string; threadId?: string | null; + inChat?: boolean; }) { const { t } = useTranslation(); const { data: suggestedPromptIdeas = [], isPending } = useQuery({ @@ -35,7 +37,7 @@ function Ideas({ return (
- Suggested Ideas: + {inChat ? 'Suggested Follow-up Questions' : 'Suggested Ideas:'}
{isPending ? (
diff --git a/frontend/app/components/ui/CopyButton/CopyButton.tsx b/frontend/app/components/ui/CopyButton/CopyButton.tsx index f82375914..9628eac8d 100644 --- a/frontend/app/components/ui/CopyButton/CopyButton.tsx +++ b/frontend/app/components/ui/CopyButton/CopyButton.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import copy from 'copy-to-clipboard'; import { Button, Tooltip } from 'antd'; -import { ClipboardCopy, ClipboardCheck } from 'lucide-react'; +import { Copy, Check } from 'lucide-react'; interface Props { content: string; @@ -30,10 +30,10 @@ function CopyButton({ setTimeout(() => { setCopied(false); }, 1000); - } + }; const copyHandler = () => { setCopied(true); - const contentIsGetter = !!getHtml + const contentIsGetter = !!getHtml; const textContent = contentIsGetter ? getHtml() : content; const isHttps = window.location.protocol === 'https:'; if (!isHttps) { @@ -43,15 +43,16 @@ function CopyButton({ } const blob = new Blob([textContent], { type: format }); const cbItem = new ClipboardItem({ - [format]: blob - }) - navigator.clipboard.write([cbItem]) - .catch(e => { + [format]: blob, + }); + navigator.clipboard + .write([cbItem]) + .catch((e) => { copy(textContent); }) .finally(() => { - reset() - }) + reset(); + }); }; if (isIcon) { @@ -62,7 +63,11 @@ function CopyButton({ onClick={copyHandler} size={size} icon={ - copied ? : + copied ? ( + + ) : ( + + ) } /> diff --git a/frontend/app/components/ui/Icons/export_pdf.tsx b/frontend/app/components/ui/Icons/export_pdf.tsx new file mode 100644 index 000000000..c267c5d8d --- /dev/null +++ b/frontend/app/components/ui/Icons/export_pdf.tsx @@ -0,0 +1,18 @@ +/* Auto-generated, do not edit */ +import React from 'react'; + +interface Props { + size?: number | string; + width?: number | string; + height?: number | string; + fill?: string; +} + +function Export_pdf(props: Props) { + const { size = 14, width = size, height = size, fill = '' } = props; + return ( + + ); +} + +export default Export_pdf; diff --git a/frontend/app/components/ui/Icons/index.ts b/frontend/app/components/ui/Icons/index.ts index e394b2d84..849046c42 100644 --- a/frontend/app/components/ui/Icons/index.ts +++ b/frontend/app/components/ui/Icons/index.ts @@ -211,6 +211,7 @@ export { default as Exclamation_circle_fill } from './exclamation_circle_fill'; export { default as Exclamation_circle } from './exclamation_circle'; export { default as Exclamation_triangle } from './exclamation_triangle'; export { default as Explosion } from './explosion'; +export { default as Export_pdf } from './export_pdf'; export { default as External_link_alt } from './external_link_alt'; export { default as Eye_slash_fill } from './eye_slash_fill'; export { default as Eye_slash } from './eye_slash'; diff --git a/frontend/app/components/ui/SVG.tsx b/frontend/app/components/ui/SVG.tsx index e10f6830c..a9ebb6839 100644 --- a/frontend/app/components/ui/SVG.tsx +++ b/frontend/app/components/ui/SVG.tsx @@ -213,6 +213,7 @@ import { Exclamation_circle, Exclamation_triangle, Explosion, + Export_pdf, External_link_alt, Eye_slash_fill, Eye_slash, @@ -488,7 +489,7 @@ import { Zoom_in } from './Icons' -export type IconNames = 'activity' | 'analytics' | 'anchor' | 'arrow-bar-left' | 'arrow-clockwise' | 'arrow-counterclockwise' | 'arrow-down-short' | 'arrow-down-up' | 'arrow-down' | 'arrow-repeat' | 'arrow-right-short' | 'arrow-up-short' | 'arrow-up' | 'avatar/icn_avatar1' | 'avatar/icn_avatar10' | 'avatar/icn_avatar11' | 'avatar/icn_avatar12' | 'avatar/icn_avatar13' | 'avatar/icn_avatar14' | 'avatar/icn_avatar15' | 'avatar/icn_avatar16' | 'avatar/icn_avatar17' | 'avatar/icn_avatar18' | 'avatar/icn_avatar19' | 'avatar/icn_avatar2' | 'avatar/icn_avatar20' | 'avatar/icn_avatar21' | 'avatar/icn_avatar22' | 'avatar/icn_avatar23' | 'avatar/icn_avatar3' | 'avatar/icn_avatar4' | 'avatar/icn_avatar5' | 'avatar/icn_avatar6' | 'avatar/icn_avatar7' | 'avatar/icn_avatar8' | 'avatar/icn_avatar9' | 'ban' | 'bar-chart-line' | 'bar-pencil' | 'battery-charging' | 'battery' | 'bell-plus' | 'bell-slash' | 'bell' | 'binoculars' | 'book' | 'bookmark' | 'broadcast' | 'browser/browser' | 'browser/chrome' | 'browser/edge' | 'browser/electron' | 'browser/facebook' | 'browser/firefox' | 'browser/ie' | 'browser/opera' | 'browser/safari' | 'buildings' | 'bullhorn' | 'calendar' | 'call' | 'camera-video-off' | 'camera-video' | 'camera' | 'card-list' | 'card-text' | 'caret-down-fill' | 'caret-right-fill' | 'chat-dots' | 'chat-left-text' | 'chat-square-quote' | 'check-circle-fill' | 'check-circle' | 'check' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'circle-fill' | 'circle' | 'click-hesitation' | 'click-rage' | 'clipboard-check' | 'clock-history' | 'clock' | 'close' | 'code' | 'cog' | 'cogs' | 'collection-play' | 'collection' | 'color/apple' | 'color/browser/chrome' | 'color/browser/edge' | 'color/browser/facebook' | 'color/browser/firefox' | 'color/browser/google' | 'color/browser/opera' | 'color/browser/safari' | 'color/browser/unknown' | 'color/browser/whale' | 'color/chrome' | 'color/country/de' | 'color/country/fr' | 'color/country/gb' | 'color/country/in' | 'color/country/us' | 'color/de' | 'color/device/desktop' | 'color/device/mobile' | 'color/device/tablet' | 'color/device/unkown' | 'color/edge' | 'color/fedora' | 'color/firefox' | 'color/fr' | 'color/gb' | 'color/in' | 'color/issues/bad_request' | 'color/issues/click_rage' | 'color/issues/cpu' | 'color/issues/crash' | 'color/issues/custom' | 'color/issues/dead_click' | 'color/issues/errors' | 'color/issues/excessive_scrolling' | 'color/issues/js_exception' | 'color/issues/memory' | 'color/issues/missing_resource' | 'color/issues/mouse_thrashing' | 'color/issues/slow_page_load' | 'color/microsoft' | 'color/opera' | 'color/os/android' | 'color/os/apple' | 'color/os/elementary' | 'color/os/fedora' | 'color/os/ios' | 'color/os/linux' | 'color/os/macos' | 'color/os/microsoft' | 'color/os/ubuntu' | 'color/os/unkown' | 'color/safari' | 'color/ubuntu' | 'color/us' | 'columns-gap' | 'console/error' | 'console/exception' | 'console/info' | 'console/warning' | 'console' | 'controller' | 'cookies' | 'copy' | 'credit-card-2-back' | 'cross' | 'cubes' | 'cursor-trash' | 'cypress' | 'dash' | 'dashboard-icn' | 'dashboards/circle-alert' | 'dashboards/cohort-chart' | 'dashboards/heatmap-2' | 'dashboards/user-journey' | 'db-icons/icn-card-clickMap' | 'db-icons/icn-card-errors' | 'db-icons/icn-card-funnel' | 'db-icons/icn-card-funnels' | 'db-icons/icn-card-insights' | 'db-icons/icn-card-library' | 'db-icons/icn-card-mapchart' | 'db-icons/icn-card-pathAnalysis' | 'db-icons/icn-card-performance' | 'db-icons/icn-card-resources' | 'db-icons/icn-card-table' | 'db-icons/icn-card-timeseries' | 'db-icons/icn-card-webVitals' | 'desktop' | 'device' | 'diagram-3' | 'dizzy' | 'door-closed' | 'download' | 'drag' | 'edit' | 'ellipsis-v' | 'emoji-dizzy' | 'enter' | 'envelope-check' | 'envelope-paper' | 'envelope-x' | 'envelope' | 'errors-icon' | 'event/click' | 'event/click_hesitation' | 'event/clickrage' | 'event/code' | 'event/i-cursor' | 'event/input' | 'event/input_hesitation' | 'event/link' | 'event/location' | 'event/mouse_thrashing' | 'event/resize' | 'event/view' | 'exclamation-circle-fill' | 'exclamation-circle' | 'exclamation-triangle' | 'explosion' | 'external-link-alt' | 'eye-slash-fill' | 'eye-slash' | 'eye' | 'fetch-request' | 'fetch' | 'fflag-multi' | 'fflag-single' | 'file-bar-graph' | 'file-code' | 'file-medical-alt' | 'file-pdf' | 'file' | 'files' | 'filetype-js' | 'filetype-pdf' | 'filter' | 'filters/arrow-return-right' | 'filters/browser' | 'filters/chevrons-up-down' | 'filters/click' | 'filters/clickrage' | 'filters/code' | 'filters/console' | 'filters/country' | 'filters/cpu-load' | 'filters/custom' | 'filters/device' | 'filters/dom-complete' | 'filters/duration' | 'filters/error' | 'filters/fetch-failed' | 'filters/fetch' | 'filters/file-code' | 'filters/graphql' | 'filters/i-cursor' | 'filters/input' | 'filters/lcpt' | 'filters/link' | 'filters/location' | 'filters/memory-load' | 'filters/metadata' | 'filters/os' | 'filters/perfromance-network-request' | 'filters/platform' | 'filters/referrer' | 'filters/resize' | 'filters/rev-id' | 'filters/screen' | 'filters/state-action' | 'filters/tag-element' | 'filters/ttfb' | 'filters/user-alt' | 'filters/userid' | 'filters/view' | 'flag-na' | 'folder-plus' | 'folder2' | 'fullscreen' | 'funnel/cpu-fill' | 'funnel/cpu' | 'funnel/dizzy' | 'funnel/emoji-angry-fill' | 'funnel/emoji-angry' | 'funnel/emoji-dizzy-fill' | 'funnel/exclamation-circle-fill' | 'funnel/exclamation-circle' | 'funnel/file-earmark-break-fill' | 'funnel/file-earmark-break' | 'funnel/file-earmark-minus-fill' | 'funnel/file-earmark-minus' | 'funnel/file-medical-alt' | 'funnel/file-x' | 'funnel/hdd-fill' | 'funnel/hourglass-top' | 'funnel/image-fill' | 'funnel/image' | 'funnel/microchip' | 'funnel/mouse' | 'funnel/patch-exclamation-fill' | 'funnel/sd-card' | 'funnel-fill' | 'funnel' | 'gear' | 'github' | 'graph-up' | 'grid-3x3' | 'grid-check' | 'grid' | 'hash' | 'headset' | 'history' | 'ic-errors' | 'ic-network' | 'ic-rage' | 'ic-resources' | 'icn_fetch-request' | 'icn_referrer' | 'icn_url' | 'id-card' | 'image' | 'info-circle-fill' | 'info-circle' | 'info-square' | 'info' | 'input-hesitation' | 'inspect' | 'integrations/assist' | 'integrations/bugsnag-text' | 'integrations/bugsnag' | 'integrations/cloudwatch-text' | 'integrations/cloudwatch' | 'integrations/datadog' | 'integrations/dynatrace' | 'integrations/elasticsearch-text' | 'integrations/elasticsearch' | 'integrations/github' | 'integrations/graphql' | 'integrations/jira-text' | 'integrations/jira' | 'integrations/mobx' | 'integrations/newrelic-text' | 'integrations/newrelic' | 'integrations/ngrx' | 'integrations/openreplay-text' | 'integrations/openreplay' | 'integrations/redux' | 'integrations/rollbar-text' | 'integrations/rollbar' | 'integrations/segment' | 'integrations/sentry-text' | 'integrations/sentry' | 'integrations/slack-bw' | 'integrations/slack' | 'integrations/stackdriver' | 'integrations/sumologic-text' | 'integrations/sumologic' | 'integrations/teams-white' | 'integrations/teams' | 'integrations/vuejs' | 'integrations/zustand' | 'journal-code' | 'kai-mono' | 'kai' | 'kai_colored' | 'key' | 'keyboard' | 'layers-half' | 'lightbulb-on' | 'lightbulb' | 'link-45deg' | 'list-alt' | 'list-ul' | 'list' | 'low-disc-space' | 'magic' | 'map-marker-alt' | 'memory-ios' | 'memory' | 'metadata-more' | 'mic-mute' | 'mic' | 'minus' | 'mobile' | 'mouse-alt' | 'mouse-pointer-click' | 'network' | 'next1' | 'no-dashboard' | 'no-metrics-chart' | 'no-metrics' | 'no-recordings' | 'orIcn' | 'orSpot' | 'orspotOutline' | 'os/android' | 'os/chrome_os' | 'os/fedora' | 'os/ios' | 'os/linux' | 'os/mac_os_x' | 'os/other' | 'os/ubuntu' | 'os/windows' | 'os' | 'pause-circle-fill' | 'pause-fill' | 'pause' | 'pdf-download' | 'pencil-stop' | 'pencil' | 'people' | 'percent' | 'performance-icon' | 'person-border' | 'person-fill' | 'person' | 'pie-chart-fill' | 'pin-fill' | 'play-circle-bold' | 'play-circle-light' | 'play-circle' | 'play-fill-new' | 'play-fill' | 'play-hover' | 'play' | 'plug' | 'plus-circle' | 'plus' | 'prev1' | 'pulse' | 'puppeteer' | 'puzzle-piece' | 'puzzle' | 'pwright' | 'question-circle' | 'question-lg' | 'quotes' | 'record-circle-fill' | 'record-circle' | 'record2' | 'redo' | 'redux' | 'referrer' | 'remote-control' | 'resources-icon' | 'safe' | 'sandglass' | 'search' | 'server' | 'share-alt' | 'shield-lock' | 'side_menu_closed' | 'side_menu_open' | 'signpost-split' | 'signup' | 'slack' | 'slash-circle' | 'sleep' | 'sliders' | 'social/slack' | 'social/trello' | 'sparkles' | 'speedometer2' | 'spinner' | 'square-mouse-pointer' | 'star' | 'step-forward' | 'stickies' | 'stop-record-circle' | 'stopwatch' | 'store' | 'sync-alt' | 'table' | 'tags' | 'terminal' | 'thermometer-sun' | 'toggles' | 'tools' | 'trash' | 'turtle' | 'user-alt' | 'user-circle' | 'user-friends' | 'user-journey' | 'user-switch' | 'users' | 'vendors/graphql' | 'web-vitals' | 'wifi' | 'window-x' | 'window' | 'zoom-in'; +export type IconNames = 'activity' | 'analytics' | 'anchor' | 'arrow-bar-left' | 'arrow-clockwise' | 'arrow-counterclockwise' | 'arrow-down-short' | 'arrow-down-up' | 'arrow-down' | 'arrow-repeat' | 'arrow-right-short' | 'arrow-up-short' | 'arrow-up' | 'avatar/icn_avatar1' | 'avatar/icn_avatar10' | 'avatar/icn_avatar11' | 'avatar/icn_avatar12' | 'avatar/icn_avatar13' | 'avatar/icn_avatar14' | 'avatar/icn_avatar15' | 'avatar/icn_avatar16' | 'avatar/icn_avatar17' | 'avatar/icn_avatar18' | 'avatar/icn_avatar19' | 'avatar/icn_avatar2' | 'avatar/icn_avatar20' | 'avatar/icn_avatar21' | 'avatar/icn_avatar22' | 'avatar/icn_avatar23' | 'avatar/icn_avatar3' | 'avatar/icn_avatar4' | 'avatar/icn_avatar5' | 'avatar/icn_avatar6' | 'avatar/icn_avatar7' | 'avatar/icn_avatar8' | 'avatar/icn_avatar9' | 'ban' | 'bar-chart-line' | 'bar-pencil' | 'battery-charging' | 'battery' | 'bell-plus' | 'bell-slash' | 'bell' | 'binoculars' | 'book' | 'bookmark' | 'broadcast' | 'browser/browser' | 'browser/chrome' | 'browser/edge' | 'browser/electron' | 'browser/facebook' | 'browser/firefox' | 'browser/ie' | 'browser/opera' | 'browser/safari' | 'buildings' | 'bullhorn' | 'calendar' | 'call' | 'camera-video-off' | 'camera-video' | 'camera' | 'card-list' | 'card-text' | 'caret-down-fill' | 'caret-right-fill' | 'chat-dots' | 'chat-left-text' | 'chat-square-quote' | 'check-circle-fill' | 'check-circle' | 'check' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'circle-fill' | 'circle' | 'click-hesitation' | 'click-rage' | 'clipboard-check' | 'clock-history' | 'clock' | 'close' | 'code' | 'cog' | 'cogs' | 'collection-play' | 'collection' | 'color/apple' | 'color/browser/chrome' | 'color/browser/edge' | 'color/browser/facebook' | 'color/browser/firefox' | 'color/browser/google' | 'color/browser/opera' | 'color/browser/safari' | 'color/browser/unknown' | 'color/browser/whale' | 'color/chrome' | 'color/country/de' | 'color/country/fr' | 'color/country/gb' | 'color/country/in' | 'color/country/us' | 'color/de' | 'color/device/desktop' | 'color/device/mobile' | 'color/device/tablet' | 'color/device/unkown' | 'color/edge' | 'color/fedora' | 'color/firefox' | 'color/fr' | 'color/gb' | 'color/in' | 'color/issues/bad_request' | 'color/issues/click_rage' | 'color/issues/cpu' | 'color/issues/crash' | 'color/issues/custom' | 'color/issues/dead_click' | 'color/issues/errors' | 'color/issues/excessive_scrolling' | 'color/issues/js_exception' | 'color/issues/memory' | 'color/issues/missing_resource' | 'color/issues/mouse_thrashing' | 'color/issues/slow_page_load' | 'color/microsoft' | 'color/opera' | 'color/os/android' | 'color/os/apple' | 'color/os/elementary' | 'color/os/fedora' | 'color/os/ios' | 'color/os/linux' | 'color/os/macos' | 'color/os/microsoft' | 'color/os/ubuntu' | 'color/os/unkown' | 'color/safari' | 'color/ubuntu' | 'color/us' | 'columns-gap' | 'console/error' | 'console/exception' | 'console/info' | 'console/warning' | 'console' | 'controller' | 'cookies' | 'copy' | 'credit-card-2-back' | 'cross' | 'cubes' | 'cursor-trash' | 'cypress' | 'dash' | 'dashboard-icn' | 'dashboards/circle-alert' | 'dashboards/cohort-chart' | 'dashboards/heatmap-2' | 'dashboards/user-journey' | 'db-icons/icn-card-clickMap' | 'db-icons/icn-card-errors' | 'db-icons/icn-card-funnel' | 'db-icons/icn-card-funnels' | 'db-icons/icn-card-insights' | 'db-icons/icn-card-library' | 'db-icons/icn-card-mapchart' | 'db-icons/icn-card-pathAnalysis' | 'db-icons/icn-card-performance' | 'db-icons/icn-card-resources' | 'db-icons/icn-card-table' | 'db-icons/icn-card-timeseries' | 'db-icons/icn-card-webVitals' | 'desktop' | 'device' | 'diagram-3' | 'dizzy' | 'door-closed' | 'download' | 'drag' | 'edit' | 'ellipsis-v' | 'emoji-dizzy' | 'enter' | 'envelope-check' | 'envelope-paper' | 'envelope-x' | 'envelope' | 'errors-icon' | 'event/click' | 'event/click_hesitation' | 'event/clickrage' | 'event/code' | 'event/i-cursor' | 'event/input' | 'event/input_hesitation' | 'event/link' | 'event/location' | 'event/mouse_thrashing' | 'event/resize' | 'event/view' | 'exclamation-circle-fill' | 'exclamation-circle' | 'exclamation-triangle' | 'explosion' | 'export-pdf' | 'external-link-alt' | 'eye-slash-fill' | 'eye-slash' | 'eye' | 'fetch-request' | 'fetch' | 'fflag-multi' | 'fflag-single' | 'file-bar-graph' | 'file-code' | 'file-medical-alt' | 'file-pdf' | 'file' | 'files' | 'filetype-js' | 'filetype-pdf' | 'filter' | 'filters/arrow-return-right' | 'filters/browser' | 'filters/chevrons-up-down' | 'filters/click' | 'filters/clickrage' | 'filters/code' | 'filters/console' | 'filters/country' | 'filters/cpu-load' | 'filters/custom' | 'filters/device' | 'filters/dom-complete' | 'filters/duration' | 'filters/error' | 'filters/fetch-failed' | 'filters/fetch' | 'filters/file-code' | 'filters/graphql' | 'filters/i-cursor' | 'filters/input' | 'filters/lcpt' | 'filters/link' | 'filters/location' | 'filters/memory-load' | 'filters/metadata' | 'filters/os' | 'filters/perfromance-network-request' | 'filters/platform' | 'filters/referrer' | 'filters/resize' | 'filters/rev-id' | 'filters/screen' | 'filters/state-action' | 'filters/tag-element' | 'filters/ttfb' | 'filters/user-alt' | 'filters/userid' | 'filters/view' | 'flag-na' | 'folder-plus' | 'folder2' | 'fullscreen' | 'funnel/cpu-fill' | 'funnel/cpu' | 'funnel/dizzy' | 'funnel/emoji-angry-fill' | 'funnel/emoji-angry' | 'funnel/emoji-dizzy-fill' | 'funnel/exclamation-circle-fill' | 'funnel/exclamation-circle' | 'funnel/file-earmark-break-fill' | 'funnel/file-earmark-break' | 'funnel/file-earmark-minus-fill' | 'funnel/file-earmark-minus' | 'funnel/file-medical-alt' | 'funnel/file-x' | 'funnel/hdd-fill' | 'funnel/hourglass-top' | 'funnel/image-fill' | 'funnel/image' | 'funnel/microchip' | 'funnel/mouse' | 'funnel/patch-exclamation-fill' | 'funnel/sd-card' | 'funnel-fill' | 'funnel' | 'gear' | 'github' | 'graph-up' | 'grid-3x3' | 'grid-check' | 'grid' | 'hash' | 'headset' | 'history' | 'ic-errors' | 'ic-network' | 'ic-rage' | 'ic-resources' | 'icn_fetch-request' | 'icn_referrer' | 'icn_url' | 'id-card' | 'image' | 'info-circle-fill' | 'info-circle' | 'info-square' | 'info' | 'input-hesitation' | 'inspect' | 'integrations/assist' | 'integrations/bugsnag-text' | 'integrations/bugsnag' | 'integrations/cloudwatch-text' | 'integrations/cloudwatch' | 'integrations/datadog' | 'integrations/dynatrace' | 'integrations/elasticsearch-text' | 'integrations/elasticsearch' | 'integrations/github' | 'integrations/graphql' | 'integrations/jira-text' | 'integrations/jira' | 'integrations/mobx' | 'integrations/newrelic-text' | 'integrations/newrelic' | 'integrations/ngrx' | 'integrations/openreplay-text' | 'integrations/openreplay' | 'integrations/redux' | 'integrations/rollbar-text' | 'integrations/rollbar' | 'integrations/segment' | 'integrations/sentry-text' | 'integrations/sentry' | 'integrations/slack-bw' | 'integrations/slack' | 'integrations/stackdriver' | 'integrations/sumologic-text' | 'integrations/sumologic' | 'integrations/teams-white' | 'integrations/teams' | 'integrations/vuejs' | 'integrations/zustand' | 'journal-code' | 'kai-mono' | 'kai' | 'kai_colored' | 'key' | 'keyboard' | 'layers-half' | 'lightbulb-on' | 'lightbulb' | 'link-45deg' | 'list-alt' | 'list-ul' | 'list' | 'low-disc-space' | 'magic' | 'map-marker-alt' | 'memory-ios' | 'memory' | 'metadata-more' | 'mic-mute' | 'mic' | 'minus' | 'mobile' | 'mouse-alt' | 'mouse-pointer-click' | 'network' | 'next1' | 'no-dashboard' | 'no-metrics-chart' | 'no-metrics' | 'no-recordings' | 'orIcn' | 'orSpot' | 'orspotOutline' | 'os/android' | 'os/chrome_os' | 'os/fedora' | 'os/ios' | 'os/linux' | 'os/mac_os_x' | 'os/other' | 'os/ubuntu' | 'os/windows' | 'os' | 'pause-circle-fill' | 'pause-fill' | 'pause' | 'pdf-download' | 'pencil-stop' | 'pencil' | 'people' | 'percent' | 'performance-icon' | 'person-border' | 'person-fill' | 'person' | 'pie-chart-fill' | 'pin-fill' | 'play-circle-bold' | 'play-circle-light' | 'play-circle' | 'play-fill-new' | 'play-fill' | 'play-hover' | 'play' | 'plug' | 'plus-circle' | 'plus' | 'prev1' | 'pulse' | 'puppeteer' | 'puzzle-piece' | 'puzzle' | 'pwright' | 'question-circle' | 'question-lg' | 'quotes' | 'record-circle-fill' | 'record-circle' | 'record2' | 'redo' | 'redux' | 'referrer' | 'remote-control' | 'resources-icon' | 'safe' | 'sandglass' | 'search' | 'server' | 'share-alt' | 'shield-lock' | 'side_menu_closed' | 'side_menu_open' | 'signpost-split' | 'signup' | 'slack' | 'slash-circle' | 'sleep' | 'sliders' | 'social/slack' | 'social/trello' | 'sparkles' | 'speedometer2' | 'spinner' | 'square-mouse-pointer' | 'star' | 'step-forward' | 'stickies' | 'stop-record-circle' | 'stopwatch' | 'store' | 'sync-alt' | 'table' | 'tags' | 'terminal' | 'thermometer-sun' | 'toggles' | 'tools' | 'trash' | 'turtle' | 'user-alt' | 'user-circle' | 'user-friends' | 'user-journey' | 'user-switch' | 'users' | 'vendors/graphql' | 'web-vitals' | 'wifi' | 'window-x' | 'window' | 'zoom-in'; interface Props { name: IconNames; @@ -1136,6 +1137,9 @@ const SVG = (props: Props) => { case 'explosion': return ; + // case 'export-pdf': + case 'export-pdf': return ; + // case 'external-link-alt': case 'external-link-alt': return ; diff --git a/frontend/app/styles/global.css b/frontend/app/styles/global.css index 068b7857e..b6154b6d2 100644 --- a/frontend/app/styles/global.css +++ b/frontend/app/styles/global.css @@ -25,6 +25,11 @@ img { stroke-width: 1.5px; } +.reset .lucide { + stroke-width: revert-layer; +} + + .ant-pagination-simple-pager input { min-width: 80px; } diff --git a/frontend/app/svg/icons/export-pdf.svg b/frontend/app/svg/icons/export-pdf.svg new file mode 100644 index 000000000..9bc497e2b --- /dev/null +++ b/frontend/app/svg/icons/export-pdf.svg @@ -0,0 +1,7 @@ + + + + + + + From 82599f4afd779b4d0475ffd32f9a56d42792bbda Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Wed, 28 May 2025 14:12:34 +0200 Subject: [PATCH 39/67] ui: spacings for chats modal --- frontend/app/components/Kai/components/ChatsModal.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/app/components/Kai/components/ChatsModal.tsx b/frontend/app/components/Kai/components/ChatsModal.tsx index 6a8c37753..4165328fb 100644 --- a/frontend/app/components/Kai/components/ChatsModal.tsx +++ b/frontend/app/components/Kai/components/ChatsModal.tsx @@ -76,7 +76,7 @@ function ChatsModal({ {t('Loading chats')}...
) : ( -
+
{datedCollections.map((col, i) => ( +
{date}
From 3c249b2b5a39449724b94830332c11575265c88e Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 28 May 2025 14:42:06 +0200 Subject: [PATCH 40/67] Add incident event (#3380) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add incindent messages * feat(proto): regenerated proto files * feat(proto): insert incident message to CH * added incidents * genereate mobs * feat(db): added incident event insertion to PG * add incidents to session config * fixed activity incident highlight * fixed incidents search --------- Co-authored-by: Андрей Бабушкин --- backend/cmd/db/main.go | 2 +- backend/internal/db/datasaver/web.go | 5 + backend/pkg/db/clickhouse/connector.go | 44 +- backend/pkg/db/postgres/events.go | 12 + backend/pkg/hashid/hashid.go | 8 + backend/pkg/messages/filters.go | 2 +- backend/pkg/messages/messages.go | 957 +++--- backend/pkg/messages/read-message.go | 2893 +++++++++-------- ee/connectors/msgcodec/messages.py | 9 + ee/connectors/msgcodec/messages.pyx | 13 + ee/connectors/msgcodec/msgcodec.py | 7 + ee/connectors/msgcodec/msgcodec.pyx | 7 + .../EventsBlock/EventGroupWrapper.tsx | 48 +- .../Session_/EventsBlock/EventsBlock.tsx | 63 +- .../Session_/Player/Controls/EventsList.tsx | 25 +- .../Player/Controls/getTimelineEventWidth.ts | 21 + .../components/SessionTags/SessionTags.tsx | 3 +- .../Icons/funnel_message_circle_warning.tsx | 18 + frontend/app/components/ui/Icons/index.ts | 1 + frontend/app/components/ui/SVG.tsx | 4 + frontend/app/mstore/sessionStore.ts | 4 +- frontend/app/player/web/Lists.ts | 1 + .../web/messages/RawMessageReader.gen.ts | 12 + .../app/player/web/messages/message.gen.ts | 3 + frontend/app/player/web/messages/raw.gen.ts | 10 +- .../player/web/messages/tracker-legacy.gen.ts | 1 + .../app/player/web/messages/tracker.gen.ts | 18 +- .../icons/funnel/message-circle-warning.svg | 1 + frontend/app/types/session/event.ts | 31 +- frontend/app/types/session/issue.ts | 10 +- frontend/app/types/session/session.ts | 13 +- mobs/messages.rb | 8 +- tracker/tracker/src/common/messages.gen.ts | 10 +- tracker/tracker/src/main/app/messages.gen.ts | 13 + tracker/tracker/src/main/index.ts | 13 +- .../src/webworker/MessageEncoder.gen.ts | 4 + 36 files changed, 2339 insertions(+), 1955 deletions(-) create mode 100644 frontend/app/components/Session_/Player/Controls/getTimelineEventWidth.ts create mode 100644 frontend/app/components/ui/Icons/funnel_message_circle_warning.tsx create mode 100644 frontend/app/svg/icons/funnel/message-circle-warning.svg diff --git a/backend/cmd/db/main.go b/backend/cmd/db/main.go index 77ad5edd8..f468f5f4f 100644 --- a/backend/cmd/db/main.go +++ b/backend/cmd/db/main.go @@ -70,7 +70,7 @@ func main() { messages.MsgMouseClickDeprecated, messages.MsgSetPageLocation, messages.MsgSetPageLocationDeprecated, messages.MsgPageLoadTiming, messages.MsgPageRenderTiming, messages.MsgPageEvent, messages.MsgPageEventDeprecated, messages.MsgMouseThrashing, messages.MsgInputChange, - messages.MsgUnbindNodes, messages.MsgCanvasNode, messages.MsgTagTrigger, + messages.MsgUnbindNodes, messages.MsgCanvasNode, messages.MsgTagTrigger, messages.MsgIncident, // Mobile messages messages.MsgMobileSessionStart, messages.MsgMobileSessionEnd, messages.MsgMobileUserID, messages.MsgMobileUserAnonymousID, messages.MsgMobileMetadata, messages.MsgMobileEvent, messages.MsgMobileNetworkCall, diff --git a/backend/internal/db/datasaver/web.go b/backend/internal/db/datasaver/web.go index 701fe0e8d..b98cc4759 100644 --- a/backend/internal/db/datasaver/web.go +++ b/backend/internal/db/datasaver/web.go @@ -140,6 +140,11 @@ func (s *saverImpl) handleWebMessage(sessCtx context.Context, session *sessions. return err } return s.ch.InsertWebPerformanceTrackAggr(session, m) + case *messages.Incident: + if err := s.pg.InsertIncident(session, m); err != nil { + return err + } + return s.ch.InsertIncident(session, m) } return nil } diff --git a/backend/pkg/db/clickhouse/connector.go b/backend/pkg/db/clickhouse/connector.go index 476ae84ed..de39bb2cc 100644 --- a/backend/pkg/db/clickhouse/connector.go +++ b/backend/pkg/db/clickhouse/connector.go @@ -39,6 +39,7 @@ type Connector interface { InsertIssue(session *sessions.Session, msg *messages.IssueEvent) error InsertWebInputDuration(session *sessions.Session, msg *messages.InputChange) error InsertMouseThrashing(session *sessions.Session, msg *messages.MouseThrashing) error + InsertIncident(session *sessions.Session, msg *messages.Incident) error InsertMobileSession(session *sessions.Session) error InsertMobileCustom(session *sessions.Session, msg *messages.MobileEvent) error InsertMobileClick(session *sessions.Session, msg *messages.MobileClickEvent) error @@ -111,8 +112,8 @@ var batches = map[string]string{ "pages": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, "clicks": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, "inputs": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$duration_s", "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, - "errors": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", error_id, "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, - "performance": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + "errors": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", error_id, "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + "performance": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, "requests": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$duration_s", "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, "custom": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$properties", properties) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, "graphql": `INSERT INTO product_analytics.events (session_id, project_id, event_id, "$event_name", created_at, "$time", distinct_id, "$auto_captured", "$device", "$os_version", "$os", "$browser", "$referrer", "$country", "$state", "$city", "$current_url", "$properties") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, @@ -809,6 +810,45 @@ func (c *connectorImpl) InsertGraphQL(session *sessions.Session, msg *messages.G return nil } +func (c *connectorImpl) InsertIncident(session *sessions.Session, msg *messages.Incident) error { + jsonString, err := json.Marshal(map[string]interface{}{ + "label": msg.Label, + "start_time": msg.StartTime, + "end_time": msg.EndTime, + "user_device": session.UserDevice, + "user_device_type": session.UserDeviceType, + "page_title ": msg.PageTitle, + }) + if err != nil { + return fmt.Errorf("can't marshal custom event: %s", err) + } + eventTime := datetime(msg.Timestamp) + if err := c.batches["custom"].Append( + session.SessionID, + uint16(session.ProjectID), + getUUID(msg), + "INCIDENT", + eventTime, + eventTime.Unix(), + session.UserUUID, + true, + session.Platform, + session.UserOSVersion, + session.UserOS, + session.UserBrowser, + session.Referrer, + session.UserCountry, + session.UserState, + session.UserCity, + cropString(msg.Url), + jsonString, + ); err != nil { + c.checkError("custom", err) + return fmt.Errorf("can't append to custom batch: %s", err) + } + return nil +} + // Mobile events func (c *connectorImpl) InsertMobileSession(session *sessions.Session) error { diff --git a/backend/pkg/db/postgres/events.go b/backend/pkg/db/postgres/events.go index 8a61e8140..9782ea2d2 100644 --- a/backend/pkg/db/postgres/events.go +++ b/backend/pkg/db/postgres/events.go @@ -270,3 +270,15 @@ func (conn *Conn) InsertWebStatsPerformance(p *messages.PerformanceTrackAggr) er ) return nil } + +func (conn *Conn) InsertIncident(sess *sessions.Session, e *messages.Incident) error { + sessCtx := context.WithValue(context.Background(), "sessionID", sess.SessionID) + issueID := hashid.MobileIncidentID(sess.ProjectID, sess.SessionID, e.Timestamp) + if err := conn.bulks.Get("webIssues").Append(sess.ProjectID, issueID, "incident", e.Url); err != nil { + conn.log.Error(sessCtx, "insert incident issue err: %s", err) + } + if err := conn.bulks.Get("webIssueEvents").Append(sess.SessionID, issueID, e.Timestamp, truncSqIdx(e.MsgID()), nil); err != nil { + conn.log.Error(sessCtx, "insert incident issue event err: %s", err) + } + return nil +} diff --git a/backend/pkg/hashid/hashid.go b/backend/pkg/hashid/hashid.go index 0dca54e9f..bea70ea4e 100644 --- a/backend/pkg/hashid/hashid.go +++ b/backend/pkg/hashid/hashid.go @@ -38,3 +38,11 @@ func MouseThrashingID(projectID uint32, sessID, ts uint64) string { hash.Write([]byte(strconv.FormatUint(ts, 10))) return strconv.FormatUint(uint64(projectID), 16) + hex.EncodeToString(hash.Sum(nil)) } + +func MobileIncidentID(projectID uint32, sessID, ts uint64) string { + hash := fnv.New128a() + hash.Write([]byte("mobile_incident")) + hash.Write([]byte(strconv.FormatUint(sessID, 10))) + hash.Write([]byte(strconv.FormatUint(ts, 10))) + return strconv.FormatUint(uint64(projectID), 16) + hex.EncodeToString(hash.Sum(nil)) +} diff --git a/backend/pkg/messages/filters.go b/backend/pkg/messages/filters.go index 094586abf..9b84a4c92 100644 --- a/backend/pkg/messages/filters.go +++ b/backend/pkg/messages/filters.go @@ -11,4 +11,4 @@ func IsMobileType(id int) bool { func IsDOMType(id int) bool { return 0 == id || 4 == id || 5 == id || 6 == id || 7 == id || 8 == id || 9 == id || 10 == id || 11 == id || 12 == id || 13 == id || 14 == id || 15 == id || 16 == id || 18 == id || 19 == id || 20 == id || 34 == id || 35 == id || 37 == id || 38 == id || 49 == id || 50 == id || 51 == id || 43 == id || 52 == id || 54 == id || 55 == id || 57 == id || 58 == id || 59 == id || 60 == id || 61 == id || 67 == id || 68 == id || 69 == id || 70 == id || 71 == id || 72 == id || 73 == id || 74 == id || 75 == id || 76 == id || 77 == id || 113 == id || 114 == id || 117 == id || 118 == id || 119 == id || 122 == id || 93 == id || 96 == id || 100 == id || 101 == id || 102 == id || 103 == id || 104 == id || 105 == id || 106 == id || 111 == id -} +} \ No newline at end of file diff --git a/backend/pkg/messages/messages.go b/backend/pkg/messages/messages.go index a6503b7d9..d987feffc 100644 --- a/backend/pkg/messages/messages.go +++ b/backend/pkg/messages/messages.go @@ -2,127 +2,129 @@ package messages const ( - MsgTimestamp = 0 - MsgSessionStart = 1 - MsgSessionEndDeprecated = 3 - MsgSetPageLocationDeprecated = 4 - MsgSetViewportSize = 5 - MsgSetViewportScroll = 6 - MsgCreateDocument = 7 - MsgCreateElementNode = 8 - MsgCreateTextNode = 9 - MsgMoveNode = 10 - MsgRemoveNode = 11 - MsgSetNodeAttribute = 12 - MsgRemoveNodeAttribute = 13 - MsgSetNodeData = 14 - MsgSetCSSData = 15 - MsgSetNodeScroll = 16 - MsgSetInputTarget = 17 - MsgSetInputValue = 18 - MsgSetInputChecked = 19 - MsgMouseMove = 20 - MsgNetworkRequestDeprecated = 21 - MsgConsoleLog = 22 - MsgPageLoadTiming = 23 - MsgPageRenderTiming = 24 - MsgJSExceptionDeprecated = 25 - MsgIntegrationEvent = 26 - MsgCustomEvent = 27 - MsgUserID = 28 - MsgUserAnonymousID = 29 - MsgMetadata = 30 - MsgPageEventDeprecated = 31 - MsgInputEvent = 32 - MsgPageEvent = 33 - MsgStringDictGlobal = 34 - MsgSetNodeAttributeDictGlobal = 35 - MsgCSSInsertRule = 37 - MsgCSSDeleteRule = 38 - MsgFetch = 39 - MsgProfiler = 40 - MsgOTable = 41 - MsgStateAction = 42 - MsgReduxDeprecated = 44 - MsgVuex = 45 - MsgMobX = 46 - MsgNgRx = 47 - MsgGraphQLDeprecated = 48 - MsgPerformanceTrack = 49 - MsgStringDictDeprecated = 50 - MsgSetNodeAttributeDictDeprecated = 51 - MsgStringDict = 43 - MsgSetNodeAttributeDict = 52 - MsgResourceTimingDeprecatedDeprecated = 53 - MsgConnectionInformation = 54 - MsgSetPageVisibility = 55 - MsgPerformanceTrackAggr = 56 - MsgLoadFontFace = 57 - MsgSetNodeFocus = 58 - MsgLongTask = 59 - MsgSetNodeAttributeURLBased = 60 - MsgSetCSSDataURLBased = 61 - MsgIssueEventDeprecated = 62 - MsgTechnicalInfo = 63 - MsgCustomIssue = 64 - MsgAssetCache = 66 - MsgCSSInsertRuleURLBased = 67 - MsgMouseClick = 68 - MsgMouseClickDeprecated = 69 - MsgCreateIFrameDocument = 70 - MsgAdoptedSSReplaceURLBased = 71 - MsgAdoptedSSReplace = 72 - MsgAdoptedSSInsertRuleURLBased = 73 - MsgAdoptedSSInsertRule = 74 - MsgAdoptedSSDeleteRule = 75 - MsgAdoptedSSAddOwner = 76 - MsgAdoptedSSRemoveOwner = 77 - MsgJSException = 78 - MsgZustand = 79 - MsgBatchMeta = 80 - MsgBatchMetadata = 81 - MsgPartitionedMessage = 82 - MsgNetworkRequest = 83 - MsgWSChannel = 84 - MsgResourceTiming = 85 - MsgLongAnimationTask = 89 - MsgInputChange = 112 - MsgSelectionChange = 113 - MsgMouseThrashing = 114 - MsgUnbindNodes = 115 - MsgResourceTimingDeprecated = 116 - MsgTabChange = 117 - MsgTabData = 118 - MsgCanvasNode = 119 - MsgTagTrigger = 120 - MsgRedux = 121 - MsgSetPageLocation = 122 - MsgGraphQL = 123 - MsgWebVitals = 124 - MsgIssueEvent = 125 - MsgSessionEnd = 126 - MsgSessionSearch = 127 - MsgMobileSessionStart = 90 - MsgMobileSessionEnd = 91 - MsgMobileMetadata = 92 - MsgMobileEvent = 93 - MsgMobileUserID = 94 - MsgMobileUserAnonymousID = 95 - MsgMobileScreenChanges = 96 - MsgMobileCrash = 97 - MsgMobileViewComponentEvent = 98 - MsgMobileClickEvent = 100 - MsgMobileInputEvent = 101 - MsgMobilePerformanceEvent = 102 - MsgMobileLog = 103 - MsgMobileInternalError = 104 - MsgMobileNetworkCall = 105 - MsgMobileSwipeEvent = 106 - MsgMobileBatchMeta = 107 - MsgMobilePerformanceAggregated = 110 - MsgMobileIssueEvent = 111 + MsgTimestamp = 0 + MsgSessionStart = 1 + MsgSessionEndDeprecated = 3 + MsgSetPageLocationDeprecated = 4 + MsgSetViewportSize = 5 + MsgSetViewportScroll = 6 + MsgCreateDocument = 7 + MsgCreateElementNode = 8 + MsgCreateTextNode = 9 + MsgMoveNode = 10 + MsgRemoveNode = 11 + MsgSetNodeAttribute = 12 + MsgRemoveNodeAttribute = 13 + MsgSetNodeData = 14 + MsgSetCSSData = 15 + MsgSetNodeScroll = 16 + MsgSetInputTarget = 17 + MsgSetInputValue = 18 + MsgSetInputChecked = 19 + MsgMouseMove = 20 + MsgNetworkRequestDeprecated = 21 + MsgConsoleLog = 22 + MsgPageLoadTiming = 23 + MsgPageRenderTiming = 24 + MsgJSExceptionDeprecated = 25 + MsgIntegrationEvent = 26 + MsgCustomEvent = 27 + MsgUserID = 28 + MsgUserAnonymousID = 29 + MsgMetadata = 30 + MsgPageEventDeprecated = 31 + MsgInputEvent = 32 + MsgPageEvent = 33 + MsgStringDictGlobal = 34 + MsgSetNodeAttributeDictGlobal = 35 + MsgCSSInsertRule = 37 + MsgCSSDeleteRule = 38 + MsgFetch = 39 + MsgProfiler = 40 + MsgOTable = 41 + MsgStateAction = 42 + MsgReduxDeprecated = 44 + MsgVuex = 45 + MsgMobX = 46 + MsgNgRx = 47 + MsgGraphQLDeprecated = 48 + MsgPerformanceTrack = 49 + MsgStringDictDeprecated = 50 + MsgSetNodeAttributeDictDeprecated = 51 + MsgStringDict = 43 + MsgSetNodeAttributeDict = 52 + MsgResourceTimingDeprecatedDeprecated = 53 + MsgConnectionInformation = 54 + MsgSetPageVisibility = 55 + MsgPerformanceTrackAggr = 56 + MsgLoadFontFace = 57 + MsgSetNodeFocus = 58 + MsgLongTask = 59 + MsgSetNodeAttributeURLBased = 60 + MsgSetCSSDataURLBased = 61 + MsgIssueEventDeprecated = 62 + MsgTechnicalInfo = 63 + MsgCustomIssue = 64 + MsgAssetCache = 66 + MsgCSSInsertRuleURLBased = 67 + MsgMouseClick = 68 + MsgMouseClickDeprecated = 69 + MsgCreateIFrameDocument = 70 + MsgAdoptedSSReplaceURLBased = 71 + MsgAdoptedSSReplace = 72 + MsgAdoptedSSInsertRuleURLBased = 73 + MsgAdoptedSSInsertRule = 74 + MsgAdoptedSSDeleteRule = 75 + MsgAdoptedSSAddOwner = 76 + MsgAdoptedSSRemoveOwner = 77 + MsgJSException = 78 + MsgZustand = 79 + MsgBatchMeta = 80 + MsgBatchMetadata = 81 + MsgPartitionedMessage = 82 + MsgNetworkRequest = 83 + MsgWSChannel = 84 + MsgResourceTiming = 85 + MsgIncident = 87 + MsgLongAnimationTask = 89 + MsgInputChange = 112 + MsgSelectionChange = 113 + MsgMouseThrashing = 114 + MsgUnbindNodes = 115 + MsgResourceTimingDeprecated = 116 + MsgTabChange = 117 + MsgTabData = 118 + MsgCanvasNode = 119 + MsgTagTrigger = 120 + MsgRedux = 121 + MsgSetPageLocation = 122 + MsgGraphQL = 123 + MsgWebVitals = 124 + MsgIssueEvent = 125 + MsgSessionEnd = 126 + MsgSessionSearch = 127 + MsgMobileSessionStart = 90 + MsgMobileSessionEnd = 91 + MsgMobileMetadata = 92 + MsgMobileEvent = 93 + MsgMobileUserID = 94 + MsgMobileUserAnonymousID = 95 + MsgMobileScreenChanges = 96 + MsgMobileCrash = 97 + MsgMobileViewComponentEvent = 98 + MsgMobileClickEvent = 100 + MsgMobileInputEvent = 101 + MsgMobilePerformanceEvent = 102 + MsgMobileLog = 103 + MsgMobileInternalError = 104 + MsgMobileNetworkCall = 105 + MsgMobileSwipeEvent = 106 + MsgMobileBatchMeta = 107 + MsgMobilePerformanceAggregated = 110 + MsgMobileIssueEvent = 111 ) + type Timestamp struct { message Timestamp uint64 @@ -146,22 +148,22 @@ func (msg *Timestamp) TypeID() int { type SessionStart struct { message - Timestamp uint64 - ProjectID uint64 - TrackerVersion string - RevID string - UserUUID string - UserAgent string - UserOS string - UserOSVersion string - UserBrowser string - UserBrowserVersion string - UserDevice string - UserDeviceType string + Timestamp uint64 + ProjectID uint64 + TrackerVersion string + RevID string + UserUUID string + UserAgent string + UserOS string + UserOSVersion string + UserBrowser string + UserBrowserVersion string + UserDevice string + UserDeviceType string UserDeviceMemorySize uint64 - UserDeviceHeapSize uint64 - UserCountry string - UserID string + UserDeviceHeapSize uint64 + UserCountry string + UserID string } func (msg *SessionStart) Encode() []byte { @@ -218,8 +220,8 @@ func (msg *SessionEndDeprecated) TypeID() int { type SetPageLocationDeprecated struct { message - URL string - Referrer string + URL string + Referrer string NavigationStart uint64 } @@ -243,7 +245,7 @@ func (msg *SetPageLocationDeprecated) TypeID() int { type SetViewportSize struct { message - Width uint64 + Width uint64 Height uint64 } @@ -289,6 +291,7 @@ func (msg *SetViewportScroll) TypeID() int { type CreateDocument struct { message + } func (msg *CreateDocument) Encode() []byte { @@ -309,11 +312,11 @@ func (msg *CreateDocument) TypeID() int { type CreateElementNode struct { message - ID uint64 + ID uint64 ParentID uint64 - index uint64 - Tag string - SVG bool + index uint64 + Tag string + SVG bool } func (msg *CreateElementNode) Encode() []byte { @@ -338,9 +341,9 @@ func (msg *CreateElementNode) TypeID() int { type CreateTextNode struct { message - ID uint64 + ID uint64 ParentID uint64 - Index uint64 + Index uint64 } func (msg *CreateTextNode) Encode() []byte { @@ -363,9 +366,9 @@ func (msg *CreateTextNode) TypeID() int { type MoveNode struct { message - ID uint64 + ID uint64 ParentID uint64 - Index uint64 + Index uint64 } func (msg *MoveNode) Encode() []byte { @@ -409,8 +412,8 @@ func (msg *RemoveNode) TypeID() int { type SetNodeAttribute struct { message - ID uint64 - Name string + ID uint64 + Name string Value string } @@ -434,7 +437,7 @@ func (msg *SetNodeAttribute) TypeID() int { type RemoveNodeAttribute struct { message - ID uint64 + ID uint64 Name string } @@ -457,7 +460,7 @@ func (msg *RemoveNodeAttribute) TypeID() int { type SetNodeData struct { message - ID uint64 + ID uint64 Data string } @@ -480,7 +483,7 @@ func (msg *SetNodeData) TypeID() int { type SetCSSData struct { message - ID uint64 + ID uint64 Data string } @@ -504,8 +507,8 @@ func (msg *SetCSSData) TypeID() int { type SetNodeScroll struct { message ID uint64 - X int64 - Y int64 + X int64 + Y int64 } func (msg *SetNodeScroll) Encode() []byte { @@ -528,7 +531,7 @@ func (msg *SetNodeScroll) TypeID() int { type SetInputTarget struct { message - ID uint64 + ID uint64 Label string } @@ -551,9 +554,9 @@ func (msg *SetInputTarget) TypeID() int { type SetInputValue struct { message - ID uint64 + ID uint64 Value string - Mask int64 + Mask int64 } func (msg *SetInputValue) Encode() []byte { @@ -576,7 +579,7 @@ func (msg *SetInputValue) TypeID() int { type SetInputChecked struct { message - ID uint64 + ID uint64 Checked bool } @@ -622,14 +625,14 @@ func (msg *MouseMove) TypeID() int { type NetworkRequestDeprecated struct { message - Type string - Method string - URL string - Request string - Response string - Status uint64 + Type string + Method string + URL string + Request string + Response string + Status uint64 Timestamp uint64 - Duration uint64 + Duration uint64 } func (msg *NetworkRequestDeprecated) Encode() []byte { @@ -680,15 +683,15 @@ func (msg *ConsoleLog) TypeID() int { type PageLoadTiming struct { message - RequestStart uint64 - ResponseStart uint64 - ResponseEnd uint64 + RequestStart uint64 + ResponseStart uint64 + ResponseEnd uint64 DomContentLoadedEventStart uint64 - DomContentLoadedEventEnd uint64 - LoadEventStart uint64 - LoadEventEnd uint64 - FirstPaint uint64 - FirstContentfulPaint uint64 + DomContentLoadedEventEnd uint64 + LoadEventStart uint64 + LoadEventEnd uint64 + FirstPaint uint64 + FirstContentfulPaint uint64 } func (msg *PageLoadTiming) Encode() []byte { @@ -717,8 +720,8 @@ func (msg *PageLoadTiming) TypeID() int { type PageRenderTiming struct { message - SpeedIndex uint64 - VisuallyComplete uint64 + SpeedIndex uint64 + VisuallyComplete uint64 TimeToInteractive uint64 } @@ -742,7 +745,7 @@ func (msg *PageRenderTiming) TypeID() int { type JSExceptionDeprecated struct { message - Name string + Name string Message string Payload string } @@ -768,10 +771,10 @@ func (msg *JSExceptionDeprecated) TypeID() int { type IntegrationEvent struct { message Timestamp uint64 - Source string - Name string - Message string - Payload string + Source string + Name string + Message string + Payload string } func (msg *IntegrationEvent) Encode() []byte { @@ -796,7 +799,7 @@ func (msg *IntegrationEvent) TypeID() int { type CustomEvent struct { message - Name string + Name string Payload string } @@ -861,7 +864,7 @@ func (msg *UserAnonymousID) TypeID() int { type Metadata struct { message - Key string + Key string Value string } @@ -884,23 +887,23 @@ func (msg *Metadata) TypeID() int { type PageEventDeprecated struct { message - MessageID uint64 - Timestamp uint64 - URL string - Referrer string - Loaded bool - RequestStart uint64 - ResponseStart uint64 - ResponseEnd uint64 + MessageID uint64 + Timestamp uint64 + URL string + Referrer string + Loaded bool + RequestStart uint64 + ResponseStart uint64 + ResponseEnd uint64 DomContentLoadedEventStart uint64 - DomContentLoadedEventEnd uint64 - LoadEventStart uint64 - LoadEventEnd uint64 - FirstPaint uint64 - FirstContentfulPaint uint64 - SpeedIndex uint64 - VisuallyComplete uint64 - TimeToInteractive uint64 + DomContentLoadedEventEnd uint64 + LoadEventStart uint64 + LoadEventEnd uint64 + FirstPaint uint64 + FirstContentfulPaint uint64 + SpeedIndex uint64 + VisuallyComplete uint64 + TimeToInteractive uint64 } func (msg *PageEventDeprecated) Encode() []byte { @@ -937,11 +940,11 @@ func (msg *PageEventDeprecated) TypeID() int { type InputEvent struct { message - MessageID uint64 - Timestamp uint64 - Value string + MessageID uint64 + Timestamp uint64 + Value string ValueMasked bool - Label string + Label string } func (msg *InputEvent) Encode() []byte { @@ -966,24 +969,24 @@ func (msg *InputEvent) TypeID() int { type PageEvent struct { message - MessageID uint64 - Timestamp uint64 - URL string - Referrer string - Loaded bool - RequestStart uint64 - ResponseStart uint64 - ResponseEnd uint64 + MessageID uint64 + Timestamp uint64 + URL string + Referrer string + Loaded bool + RequestStart uint64 + ResponseStart uint64 + ResponseEnd uint64 DomContentLoadedEventStart uint64 - DomContentLoadedEventEnd uint64 - LoadEventStart uint64 - LoadEventEnd uint64 - FirstPaint uint64 - FirstContentfulPaint uint64 - SpeedIndex uint64 - VisuallyComplete uint64 - TimeToInteractive uint64 - WebVitals string + DomContentLoadedEventEnd uint64 + LoadEventStart uint64 + LoadEventEnd uint64 + FirstPaint uint64 + FirstContentfulPaint uint64 + SpeedIndex uint64 + VisuallyComplete uint64 + TimeToInteractive uint64 + WebVitals string } func (msg *PageEvent) Encode() []byte { @@ -1021,7 +1024,7 @@ func (msg *PageEvent) TypeID() int { type StringDictGlobal struct { message - Key uint64 + Key uint64 Value string } @@ -1044,8 +1047,8 @@ func (msg *StringDictGlobal) TypeID() int { type SetNodeAttributeDictGlobal struct { message - ID uint64 - Name uint64 + ID uint64 + Name uint64 Value uint64 } @@ -1069,8 +1072,8 @@ func (msg *SetNodeAttributeDictGlobal) TypeID() int { type CSSInsertRule struct { message - ID uint64 - Rule string + ID uint64 + Rule string Index uint64 } @@ -1094,7 +1097,7 @@ func (msg *CSSInsertRule) TypeID() int { type CSSDeleteRule struct { message - ID uint64 + ID uint64 Index uint64 } @@ -1117,13 +1120,13 @@ func (msg *CSSDeleteRule) TypeID() int { type Fetch struct { message - Method string - URL string - Request string - Response string - Status uint64 + Method string + URL string + Request string + Response string + Status uint64 Timestamp uint64 - Duration uint64 + Duration uint64 } func (msg *Fetch) Encode() []byte { @@ -1150,10 +1153,10 @@ func (msg *Fetch) TypeID() int { type Profiler struct { message - Name string + Name string Duration uint64 - Args string - Result string + Args string + Result string } func (msg *Profiler) Encode() []byte { @@ -1177,7 +1180,7 @@ func (msg *Profiler) TypeID() int { type OTable struct { message - Key string + Key string Value string } @@ -1221,8 +1224,8 @@ func (msg *StateAction) TypeID() int { type ReduxDeprecated struct { message - Action string - State string + Action string + State string Duration uint64 } @@ -1247,7 +1250,7 @@ func (msg *ReduxDeprecated) TypeID() int { type Vuex struct { message Mutation string - State string + State string } func (msg *Vuex) Encode() []byte { @@ -1269,7 +1272,7 @@ func (msg *Vuex) TypeID() int { type MobX struct { message - Type string + Type string Payload string } @@ -1292,8 +1295,8 @@ func (msg *MobX) TypeID() int { type NgRx struct { message - Action string - State string + Action string + State string Duration uint64 } @@ -1319,9 +1322,9 @@ type GraphQLDeprecated struct { message OperationKind string OperationName string - Variables string - Response string - Duration int64 + Variables string + Response string + Duration int64 } func (msg *GraphQLDeprecated) Encode() []byte { @@ -1346,10 +1349,10 @@ func (msg *GraphQLDeprecated) TypeID() int { type PerformanceTrack struct { message - Frames int64 - Ticks int64 + Frames int64 + Ticks int64 TotalJSHeapSize uint64 - UsedJSHeapSize uint64 + UsedJSHeapSize uint64 } func (msg *PerformanceTrack) Encode() []byte { @@ -1373,7 +1376,7 @@ func (msg *PerformanceTrack) TypeID() int { type StringDictDeprecated struct { message - Key uint64 + Key uint64 Value string } @@ -1396,8 +1399,8 @@ func (msg *StringDictDeprecated) TypeID() int { type SetNodeAttributeDictDeprecated struct { message - ID uint64 - NameKey uint64 + ID uint64 + NameKey uint64 ValueKey uint64 } @@ -1421,7 +1424,7 @@ func (msg *SetNodeAttributeDictDeprecated) TypeID() int { type StringDict struct { message - Key string + Key string Value string } @@ -1444,8 +1447,8 @@ func (msg *StringDict) TypeID() int { type SetNodeAttributeDict struct { message - ID uint64 - Name string + ID uint64 + Name string Value string } @@ -1469,14 +1472,14 @@ func (msg *SetNodeAttributeDict) TypeID() int { type ResourceTimingDeprecatedDeprecated struct { message - Timestamp uint64 - Duration uint64 - TTFB uint64 - HeaderSize uint64 + Timestamp uint64 + Duration uint64 + TTFB uint64 + HeaderSize uint64 EncodedBodySize uint64 DecodedBodySize uint64 - URL string - Initiator string + URL string + Initiator string } func (msg *ResourceTimingDeprecatedDeprecated) Encode() []byte { @@ -1505,7 +1508,7 @@ func (msg *ResourceTimingDeprecatedDeprecated) TypeID() int { type ConnectionInformation struct { message Downlink uint64 - Type string + Type string } func (msg *ConnectionInformation) Encode() []byte { @@ -1548,20 +1551,20 @@ func (msg *SetPageVisibility) TypeID() int { type PerformanceTrackAggr struct { message - TimestampStart uint64 - TimestampEnd uint64 - MinFPS uint64 - AvgFPS uint64 - MaxFPS uint64 - MinCPU uint64 - AvgCPU uint64 - MaxCPU uint64 + TimestampStart uint64 + TimestampEnd uint64 + MinFPS uint64 + AvgFPS uint64 + MaxFPS uint64 + MinCPU uint64 + AvgCPU uint64 + MaxCPU uint64 MinTotalJSHeapSize uint64 AvgTotalJSHeapSize uint64 MaxTotalJSHeapSize uint64 - MinUsedJSHeapSize uint64 - AvgUsedJSHeapSize uint64 - MaxUsedJSHeapSize uint64 + MinUsedJSHeapSize uint64 + AvgUsedJSHeapSize uint64 + MaxUsedJSHeapSize uint64 } func (msg *PerformanceTrackAggr) Encode() []byte { @@ -1595,9 +1598,9 @@ func (msg *PerformanceTrackAggr) TypeID() int { type LoadFontFace struct { message - ParentID uint64 - Family string - Source string + ParentID uint64 + Family string + Source string Descriptors string } @@ -1643,12 +1646,12 @@ func (msg *SetNodeFocus) TypeID() int { type LongTask struct { message - Timestamp uint64 - Duration uint64 - Context uint64 + Timestamp uint64 + Duration uint64 + Context uint64 ContainerType uint64 - ContainerSrc string - ContainerId string + ContainerSrc string + ContainerId string ContainerName string } @@ -1676,9 +1679,9 @@ func (msg *LongTask) TypeID() int { type SetNodeAttributeURLBased struct { message - ID uint64 - Name string - Value string + ID uint64 + Name string + Value string BaseURL string } @@ -1703,8 +1706,8 @@ func (msg *SetNodeAttributeURLBased) TypeID() int { type SetCSSDataURLBased struct { message - ID uint64 - Data string + ID uint64 + Data string BaseURL string } @@ -1728,12 +1731,12 @@ func (msg *SetCSSDataURLBased) TypeID() int { type IssueEventDeprecated struct { message - MessageID uint64 - Timestamp uint64 - Type string + MessageID uint64 + Timestamp uint64 + Type string ContextString string - Context string - Payload string + Context string + Payload string } func (msg *IssueEventDeprecated) Encode() []byte { @@ -1759,7 +1762,7 @@ func (msg *IssueEventDeprecated) TypeID() int { type TechnicalInfo struct { message - Type string + Type string Value string } @@ -1782,7 +1785,7 @@ func (msg *TechnicalInfo) TypeID() int { type CustomIssue struct { message - Name string + Name string Payload string } @@ -1826,9 +1829,9 @@ func (msg *AssetCache) TypeID() int { type CSSInsertRuleURLBased struct { message - ID uint64 - Rule string - Index uint64 + ID uint64 + Rule string + Index uint64 BaseURL string } @@ -1853,12 +1856,12 @@ func (msg *CSSInsertRuleURLBased) TypeID() int { type MouseClick struct { message - ID uint64 + ID uint64 HesitationTime uint64 - Label string - Selector string - NormalizedX uint64 - NormalizedY uint64 + Label string + Selector string + NormalizedX uint64 + NormalizedY uint64 } func (msg *MouseClick) Encode() []byte { @@ -1884,10 +1887,10 @@ func (msg *MouseClick) TypeID() int { type MouseClickDeprecated struct { message - ID uint64 + ID uint64 HesitationTime uint64 - Label string - Selector string + Label string + Selector string } func (msg *MouseClickDeprecated) Encode() []byte { @@ -1912,7 +1915,7 @@ func (msg *MouseClickDeprecated) TypeID() int { type CreateIFrameDocument struct { message FrameID uint64 - ID uint64 + ID uint64 } func (msg *CreateIFrameDocument) Encode() []byte { @@ -1935,7 +1938,7 @@ func (msg *CreateIFrameDocument) TypeID() int { type AdoptedSSReplaceURLBased struct { message SheetID uint64 - Text string + Text string BaseURL string } @@ -1960,7 +1963,7 @@ func (msg *AdoptedSSReplaceURLBased) TypeID() int { type AdoptedSSReplace struct { message SheetID uint64 - Text string + Text string } func (msg *AdoptedSSReplace) Encode() []byte { @@ -1983,8 +1986,8 @@ func (msg *AdoptedSSReplace) TypeID() int { type AdoptedSSInsertRuleURLBased struct { message SheetID uint64 - Rule string - Index uint64 + Rule string + Index uint64 BaseURL string } @@ -2010,8 +2013,8 @@ func (msg *AdoptedSSInsertRuleURLBased) TypeID() int { type AdoptedSSInsertRule struct { message SheetID uint64 - Rule string - Index uint64 + Rule string + Index uint64 } func (msg *AdoptedSSInsertRule) Encode() []byte { @@ -2035,7 +2038,7 @@ func (msg *AdoptedSSInsertRule) TypeID() int { type AdoptedSSDeleteRule struct { message SheetID uint64 - Index uint64 + Index uint64 } func (msg *AdoptedSSDeleteRule) Encode() []byte { @@ -2058,7 +2061,7 @@ func (msg *AdoptedSSDeleteRule) TypeID() int { type AdoptedSSAddOwner struct { message SheetID uint64 - ID uint64 + ID uint64 } func (msg *AdoptedSSAddOwner) Encode() []byte { @@ -2081,7 +2084,7 @@ func (msg *AdoptedSSAddOwner) TypeID() int { type AdoptedSSRemoveOwner struct { message SheetID uint64 - ID uint64 + ID uint64 } func (msg *AdoptedSSRemoveOwner) Encode() []byte { @@ -2103,9 +2106,9 @@ func (msg *AdoptedSSRemoveOwner) TypeID() int { type JSException struct { message - Name string - Message string - Payload string + Name string + Message string + Payload string Metadata string } @@ -2131,7 +2134,7 @@ func (msg *JSException) TypeID() int { type Zustand struct { message Mutation string - State string + State string } func (msg *Zustand) Encode() []byte { @@ -2153,9 +2156,9 @@ func (msg *Zustand) TypeID() int { type BatchMeta struct { message - PageNo uint64 + PageNo uint64 FirstIndex uint64 - Timestamp int64 + Timestamp int64 } func (msg *BatchMeta) Encode() []byte { @@ -2178,11 +2181,11 @@ func (msg *BatchMeta) TypeID() int { type BatchMetadata struct { message - Version uint64 - PageNo uint64 + Version uint64 + PageNo uint64 FirstIndex uint64 - Timestamp int64 - Location string + Timestamp int64 + Location string } func (msg *BatchMetadata) Encode() []byte { @@ -2207,7 +2210,7 @@ func (msg *BatchMetadata) TypeID() int { type PartitionedMessage struct { message - PartNo uint64 + PartNo uint64 PartTotal uint64 } @@ -2230,14 +2233,14 @@ func (msg *PartitionedMessage) TypeID() int { type NetworkRequest struct { message - Type string - Method string - URL string - Request string - Response string - Status uint64 - Timestamp uint64 - Duration uint64 + Type string + Method string + URL string + Request string + Response string + Status uint64 + Timestamp uint64 + Duration uint64 TransferredBodySize uint64 } @@ -2267,11 +2270,11 @@ func (msg *NetworkRequest) TypeID() int { type WSChannel struct { message - ChType string + ChType string ChannelName string - Data string - Timestamp uint64 - Dir string + Data string + Timestamp uint64 + Dir string MessageType string } @@ -2298,23 +2301,23 @@ func (msg *WSChannel) TypeID() int { type ResourceTiming struct { message - Timestamp uint64 - Duration uint64 - TTFB uint64 - HeaderSize uint64 - EncodedBodySize uint64 - DecodedBodySize uint64 - URL string - Initiator string - TransferredSize uint64 - Cached bool - Queueing uint64 - DnsLookup uint64 + Timestamp uint64 + Duration uint64 + TTFB uint64 + HeaderSize uint64 + EncodedBodySize uint64 + DecodedBodySize uint64 + URL string + Initiator string + TransferredSize uint64 + Cached bool + Queueing uint64 + DnsLookup uint64 InitialConnection uint64 - SSL uint64 - ContentDownload uint64 - Total uint64 - Stalled uint64 + SSL uint64 + ContentDownload uint64 + Total uint64 + Stalled uint64 } func (msg *ResourceTiming) Encode() []byte { @@ -2349,14 +2352,39 @@ func (msg *ResourceTiming) TypeID() int { return 85 } +type Incident struct { + message + Label string + StartTime int64 + EndTime int64 +} + +func (msg *Incident) Encode() []byte { + buf := make([]byte, 31+len(msg.Label)) + buf[0] = 87 + p := 1 + p = WriteString(msg.Label, buf, p) + p = WriteInt(msg.StartTime, buf, p) + p = WriteInt(msg.EndTime, buf, p) + return buf[:p] +} + +func (msg *Incident) Decode() Message { + return msg +} + +func (msg *Incident) TypeID() int { + return 87 +} + type LongAnimationTask struct { message - Name string - Duration int64 - BlockingDuration int64 + Name string + Duration int64 + BlockingDuration int64 FirstUIEventTimestamp int64 - StartTime int64 - Scripts string + StartTime int64 + Scripts string } func (msg *LongAnimationTask) Encode() []byte { @@ -2382,12 +2410,12 @@ func (msg *LongAnimationTask) TypeID() int { type InputChange struct { message - ID uint64 - Value string - ValueMasked bool - Label string + ID uint64 + Value string + ValueMasked bool + Label string HesitationTime int64 - InputDuration int64 + InputDuration int64 } func (msg *InputChange) Encode() []byte { @@ -2414,8 +2442,8 @@ func (msg *InputChange) TypeID() int { type SelectionChange struct { message SelectionStart uint64 - SelectionEnd uint64 - Selection string + SelectionEnd uint64 + Selection string } func (msg *SelectionChange) Encode() []byte { @@ -2480,16 +2508,16 @@ func (msg *UnbindNodes) TypeID() int { type ResourceTimingDeprecated struct { message - Timestamp uint64 - Duration uint64 - TTFB uint64 - HeaderSize uint64 + Timestamp uint64 + Duration uint64 + TTFB uint64 + HeaderSize uint64 EncodedBodySize uint64 DecodedBodySize uint64 - URL string - Initiator string + URL string + Initiator string TransferredSize uint64 - Cached bool + Cached bool } func (msg *ResourceTimingDeprecated) Encode() []byte { @@ -2561,7 +2589,7 @@ func (msg *TabData) TypeID() int { type CanvasNode struct { message - NodeId string + NodeId string Timestamp uint64 } @@ -2605,9 +2633,9 @@ func (msg *TagTrigger) TypeID() int { type Redux struct { message - Action string - State string - Duration uint64 + Action string + State string + Duration uint64 ActionTime uint64 } @@ -2632,10 +2660,10 @@ func (msg *Redux) TypeID() int { type SetPageLocation struct { message - URL string - Referrer string + URL string + Referrer string NavigationStart uint64 - DocumentTitle string + DocumentTitle string } func (msg *SetPageLocation) Encode() []byte { @@ -2661,9 +2689,9 @@ type GraphQL struct { message OperationKind string OperationName string - Variables string - Response string - Duration uint64 + Variables string + Response string + Duration uint64 } func (msg *GraphQL) Encode() []byte { @@ -2688,7 +2716,7 @@ func (msg *GraphQL) TypeID() int { type WebVitals struct { message - Name string + Name string Value string } @@ -2711,13 +2739,13 @@ func (msg *WebVitals) TypeID() int { type IssueEvent struct { message - MessageID uint64 - Timestamp uint64 - Type string + MessageID uint64 + Timestamp uint64 + Type string ContextString string - Context string - Payload string - URL string + Context string + Payload string + URL string } func (msg *IssueEvent) Encode() []byte { @@ -2744,7 +2772,7 @@ func (msg *IssueEvent) TypeID() int { type SessionEnd struct { message - Timestamp uint64 + Timestamp uint64 EncryptionKey string } @@ -2790,16 +2818,16 @@ func (msg *SessionSearch) TypeID() int { type MobileSessionStart struct { message - Timestamp uint64 - ProjectID uint64 + Timestamp uint64 + ProjectID uint64 TrackerVersion string - RevID string - UserUUID string - UserOS string - UserOSVersion string - UserDevice string + RevID string + UserUUID string + UserOS string + UserOSVersion string + UserDevice string UserDeviceType string - UserCountry string + UserCountry string } func (msg *MobileSessionStart) Encode() []byte { @@ -2851,9 +2879,9 @@ func (msg *MobileSessionEnd) TypeID() int { type MobileMetadata struct { message Timestamp uint64 - Length uint64 - Key string - Value string + Length uint64 + Key string + Value string } func (msg *MobileMetadata) Encode() []byte { @@ -2878,9 +2906,9 @@ func (msg *MobileMetadata) TypeID() int { type MobileEvent struct { message Timestamp uint64 - Length uint64 - Name string - Payload string + Length uint64 + Name string + Payload string } func (msg *MobileEvent) Encode() []byte { @@ -2905,8 +2933,8 @@ func (msg *MobileEvent) TypeID() int { type MobileUserID struct { message Timestamp uint64 - Length uint64 - ID string + Length uint64 + ID string } func (msg *MobileUserID) Encode() []byte { @@ -2930,8 +2958,8 @@ func (msg *MobileUserID) TypeID() int { type MobileUserAnonymousID struct { message Timestamp uint64 - Length uint64 - ID string + Length uint64 + ID string } func (msg *MobileUserAnonymousID) Encode() []byte { @@ -2955,11 +2983,11 @@ func (msg *MobileUserAnonymousID) TypeID() int { type MobileScreenChanges struct { message Timestamp uint64 - Length uint64 - X uint64 - Y uint64 - Width uint64 - Height uint64 + Length uint64 + X uint64 + Y uint64 + Width uint64 + Height uint64 } func (msg *MobileScreenChanges) Encode() []byte { @@ -2985,10 +3013,10 @@ func (msg *MobileScreenChanges) TypeID() int { type MobileCrash struct { message - Timestamp uint64 - Length uint64 - Name string - Reason string + Timestamp uint64 + Length uint64 + Name string + Reason string Stacktrace string } @@ -3014,11 +3042,11 @@ func (msg *MobileCrash) TypeID() int { type MobileViewComponentEvent struct { message - Timestamp uint64 - Length uint64 + Timestamp uint64 + Length uint64 ScreenName string - ViewName string - Visible bool + ViewName string + Visible bool } func (msg *MobileViewComponentEvent) Encode() []byte { @@ -3044,10 +3072,10 @@ func (msg *MobileViewComponentEvent) TypeID() int { type MobileClickEvent struct { message Timestamp uint64 - Length uint64 - Label string - X uint64 - Y uint64 + Length uint64 + Label string + X uint64 + Y uint64 } func (msg *MobileClickEvent) Encode() []byte { @@ -3072,11 +3100,11 @@ func (msg *MobileClickEvent) TypeID() int { type MobileInputEvent struct { message - Timestamp uint64 - Length uint64 - Value string + Timestamp uint64 + Length uint64 + Value string ValueMasked bool - Label string + Label string } func (msg *MobileInputEvent) Encode() []byte { @@ -3102,9 +3130,9 @@ func (msg *MobileInputEvent) TypeID() int { type MobilePerformanceEvent struct { message Timestamp uint64 - Length uint64 - Name string - Value uint64 + Length uint64 + Name string + Value uint64 } func (msg *MobilePerformanceEvent) Encode() []byte { @@ -3129,9 +3157,9 @@ func (msg *MobilePerformanceEvent) TypeID() int { type MobileLog struct { message Timestamp uint64 - Length uint64 - Severity string - Content string + Length uint64 + Severity string + Content string } func (msg *MobileLog) Encode() []byte { @@ -3156,8 +3184,8 @@ func (msg *MobileLog) TypeID() int { type MobileInternalError struct { message Timestamp uint64 - Length uint64 - Content string + Length uint64 + Content string } func (msg *MobileInternalError) Encode() []byte { @@ -3181,14 +3209,14 @@ func (msg *MobileInternalError) TypeID() int { type MobileNetworkCall struct { message Timestamp uint64 - Length uint64 - Type string - Method string - URL string - Request string - Response string - Status uint64 - Duration uint64 + Length uint64 + Type string + Method string + URL string + Request string + Response string + Status uint64 + Duration uint64 } func (msg *MobileNetworkCall) Encode() []byte { @@ -3218,10 +3246,10 @@ func (msg *MobileNetworkCall) TypeID() int { type MobileSwipeEvent struct { message Timestamp uint64 - Length uint64 - Label string - X uint64 - Y uint64 + Length uint64 + Label string + X uint64 + Y uint64 Direction string } @@ -3248,8 +3276,8 @@ func (msg *MobileSwipeEvent) TypeID() int { type MobileBatchMeta struct { message - Timestamp uint64 - Length uint64 + Timestamp uint64 + Length uint64 FirstIndex uint64 } @@ -3274,19 +3302,19 @@ func (msg *MobileBatchMeta) TypeID() int { type MobilePerformanceAggregated struct { message TimestampStart uint64 - TimestampEnd uint64 - MinFPS uint64 - AvgFPS uint64 - MaxFPS uint64 - MinCPU uint64 - AvgCPU uint64 - MaxCPU uint64 - MinMemory uint64 - AvgMemory uint64 - MaxMemory uint64 - MinBattery uint64 - AvgBattery uint64 - MaxBattery uint64 + TimestampEnd uint64 + MinFPS uint64 + AvgFPS uint64 + MaxFPS uint64 + MinCPU uint64 + AvgCPU uint64 + MaxCPU uint64 + MinMemory uint64 + AvgMemory uint64 + MaxMemory uint64 + MinBattery uint64 + AvgBattery uint64 + MaxBattery uint64 } func (msg *MobilePerformanceAggregated) Encode() []byte { @@ -3320,11 +3348,11 @@ func (msg *MobilePerformanceAggregated) TypeID() int { type MobileIssueEvent struct { message - Timestamp uint64 - Type string + Timestamp uint64 + Type string ContextString string - Context string - Payload string + Context string + Payload string } func (msg *MobileIssueEvent) Encode() []byte { @@ -3346,3 +3374,4 @@ func (msg *MobileIssueEvent) Decode() Message { func (msg *MobileIssueEvent) TypeID() int { return 111 } + diff --git a/backend/pkg/messages/read-message.go b/backend/pkg/messages/read-message.go index 3caa6af08..ef9a49586 100644 --- a/backend/pkg/messages/read-message.go +++ b/backend/pkg/messages/read-message.go @@ -6,2161 +6,2176 @@ import ( ) func DecodeTimestamp(reader BytesReader) (Message, error) { - var err error = nil - msg := &Timestamp{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &Timestamp{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err } func DecodeSessionStart(reader BytesReader) (Message, error) { - var err error = nil - msg := &SessionStart{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SessionStart{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.ProjectID, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.TrackerVersion, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.RevID, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserUUID, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserAgent, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserOS, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserOSVersion, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserBrowser, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserBrowserVersion, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserDevice, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserDeviceType, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserDeviceMemorySize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.UserDeviceHeapSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.UserCountry, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserID, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSessionEndDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &SessionEndDeprecated{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &SessionEndDeprecated{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err } func DecodeSetPageLocationDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetPageLocationDeprecated{} - if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &SetPageLocationDeprecated{} + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Referrer, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.NavigationStart, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetViewportSize(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetViewportSize{} - if msg.Width, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetViewportSize{} + if msg.Width, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Height, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetViewportScroll(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetViewportScroll{} - if msg.X, err = reader.ReadInt(); err != nil { - return nil, err - } + var err error = nil + msg := &SetViewportScroll{} + if msg.X, err = reader.ReadInt(); err != nil { + return nil, err + } if msg.Y, err = reader.ReadInt(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeCreateDocument(reader BytesReader) (Message, error) { - var err error = nil - msg := &CreateDocument{} - - return msg, err + var err error = nil + msg := &CreateDocument{} + + return msg, err } func DecodeCreateElementNode(reader BytesReader) (Message, error) { - var err error = nil - msg := &CreateElementNode{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &CreateElementNode{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.ParentID, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.index, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Tag, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.SVG, err = reader.ReadBoolean(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeCreateTextNode(reader BytesReader) (Message, error) { - var err error = nil - msg := &CreateTextNode{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &CreateTextNode{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.ParentID, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Index, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMoveNode(reader BytesReader) (Message, error) { - var err error = nil - msg := &MoveNode{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MoveNode{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.ParentID, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Index, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeRemoveNode(reader BytesReader) (Message, error) { - var err error = nil - msg := &RemoveNode{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &RemoveNode{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err } func DecodeSetNodeAttribute(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetNodeAttribute{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetNodeAttribute{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeRemoveNodeAttribute(reader BytesReader) (Message, error) { - var err error = nil - msg := &RemoveNodeAttribute{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &RemoveNodeAttribute{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetNodeData(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetNodeData{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetNodeData{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Data, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetCSSData(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetCSSData{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetCSSData{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Data, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetNodeScroll(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetNodeScroll{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetNodeScroll{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.X, err = reader.ReadInt(); err != nil { - return nil, err - } + return nil, err + } if msg.Y, err = reader.ReadInt(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetInputTarget(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetInputTarget{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetInputTarget{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Label, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetInputValue(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetInputValue{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetInputValue{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Mask, err = reader.ReadInt(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetInputChecked(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetInputChecked{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetInputChecked{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Checked, err = reader.ReadBoolean(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMouseMove(reader BytesReader) (Message, error) { - var err error = nil - msg := &MouseMove{} - if msg.X, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MouseMove{} + if msg.X, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Y, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeNetworkRequestDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &NetworkRequestDeprecated{} - if msg.Type, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &NetworkRequestDeprecated{} + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Method, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Request, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Response, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Status, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeConsoleLog(reader BytesReader) (Message, error) { - var err error = nil - msg := &ConsoleLog{} - if msg.Level, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &ConsoleLog{} + if msg.Level, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodePageLoadTiming(reader BytesReader) (Message, error) { - var err error = nil - msg := &PageLoadTiming{} - if msg.RequestStart, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &PageLoadTiming{} + if msg.RequestStart, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.ResponseStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ResponseEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.DomContentLoadedEventStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.DomContentLoadedEventEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.LoadEventStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.LoadEventEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.FirstPaint, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.FirstContentfulPaint, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodePageRenderTiming(reader BytesReader) (Message, error) { - var err error = nil - msg := &PageRenderTiming{} - if msg.SpeedIndex, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &PageRenderTiming{} + if msg.SpeedIndex, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.VisuallyComplete, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.TimeToInteractive, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeJSExceptionDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &JSExceptionDeprecated{} - if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &JSExceptionDeprecated{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Message, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Payload, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeIntegrationEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &IntegrationEvent{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &IntegrationEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Source, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Message, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Payload, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeCustomEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &CustomEvent{} - if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &CustomEvent{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Payload, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeUserID(reader BytesReader) (Message, error) { - var err error = nil - msg := &UserID{} - if msg.ID, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &UserID{} + if msg.ID, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err } func DecodeUserAnonymousID(reader BytesReader) (Message, error) { - var err error = nil - msg := &UserAnonymousID{} - if msg.ID, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &UserAnonymousID{} + if msg.ID, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err } func DecodeMetadata(reader BytesReader) (Message, error) { - var err error = nil - msg := &Metadata{} - if msg.Key, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &Metadata{} + if msg.Key, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodePageEventDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &PageEventDeprecated{} - if msg.MessageID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &PageEventDeprecated{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Referrer, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Loaded, err = reader.ReadBoolean(); err != nil { - return nil, err - } + return nil, err + } if msg.RequestStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ResponseStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ResponseEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.DomContentLoadedEventStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.DomContentLoadedEventEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.LoadEventStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.LoadEventEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.FirstPaint, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.FirstContentfulPaint, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.SpeedIndex, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.VisuallyComplete, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.TimeToInteractive, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeInputEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &InputEvent{} - if msg.MessageID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &InputEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.ValueMasked, err = reader.ReadBoolean(); err != nil { - return nil, err - } + return nil, err + } if msg.Label, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodePageEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &PageEvent{} - if msg.MessageID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &PageEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Referrer, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Loaded, err = reader.ReadBoolean(); err != nil { - return nil, err - } + return nil, err + } if msg.RequestStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ResponseStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ResponseEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.DomContentLoadedEventStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.DomContentLoadedEventEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.LoadEventStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.LoadEventEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.FirstPaint, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.FirstContentfulPaint, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.SpeedIndex, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.VisuallyComplete, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.TimeToInteractive, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.WebVitals, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeStringDictGlobal(reader BytesReader) (Message, error) { - var err error = nil - msg := &StringDictGlobal{} - if msg.Key, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &StringDictGlobal{} + if msg.Key, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetNodeAttributeDictGlobal(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetNodeAttributeDictGlobal{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetNodeAttributeDictGlobal{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Name, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Value, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeCSSInsertRule(reader BytesReader) (Message, error) { - var err error = nil - msg := &CSSInsertRule{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &CSSInsertRule{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Rule, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Index, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeCSSDeleteRule(reader BytesReader) (Message, error) { - var err error = nil - msg := &CSSDeleteRule{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &CSSDeleteRule{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Index, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeFetch(reader BytesReader) (Message, error) { - var err error = nil - msg := &Fetch{} - if msg.Method, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &Fetch{} + if msg.Method, err = reader.ReadString(); err != nil { + return nil, err + } if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Request, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Response, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Status, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeProfiler(reader BytesReader) (Message, error) { - var err error = nil - msg := &Profiler{} - if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &Profiler{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Args, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Result, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeOTable(reader BytesReader) (Message, error) { - var err error = nil - msg := &OTable{} - if msg.Key, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &OTable{} + if msg.Key, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeStateAction(reader BytesReader) (Message, error) { - var err error = nil - msg := &StateAction{} - if msg.Type, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &StateAction{} + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err } func DecodeReduxDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &ReduxDeprecated{} - if msg.Action, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &ReduxDeprecated{} + if msg.Action, err = reader.ReadString(); err != nil { + return nil, err + } if msg.State, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeVuex(reader BytesReader) (Message, error) { - var err error = nil - msg := &Vuex{} - if msg.Mutation, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &Vuex{} + if msg.Mutation, err = reader.ReadString(); err != nil { + return nil, err + } if msg.State, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobX(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobX{} - if msg.Type, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &MobX{} + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Payload, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeNgRx(reader BytesReader) (Message, error) { - var err error = nil - msg := &NgRx{} - if msg.Action, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &NgRx{} + if msg.Action, err = reader.ReadString(); err != nil { + return nil, err + } if msg.State, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeGraphQLDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &GraphQLDeprecated{} - if msg.OperationKind, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &GraphQLDeprecated{} + if msg.OperationKind, err = reader.ReadString(); err != nil { + return nil, err + } if msg.OperationName, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Variables, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Response, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Duration, err = reader.ReadInt(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodePerformanceTrack(reader BytesReader) (Message, error) { - var err error = nil - msg := &PerformanceTrack{} - if msg.Frames, err = reader.ReadInt(); err != nil { - return nil, err - } + var err error = nil + msg := &PerformanceTrack{} + if msg.Frames, err = reader.ReadInt(); err != nil { + return nil, err + } if msg.Ticks, err = reader.ReadInt(); err != nil { - return nil, err - } + return nil, err + } if msg.TotalJSHeapSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.UsedJSHeapSize, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeStringDictDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &StringDictDeprecated{} - if msg.Key, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &StringDictDeprecated{} + if msg.Key, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetNodeAttributeDictDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetNodeAttributeDictDeprecated{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetNodeAttributeDictDeprecated{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.NameKey, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ValueKey, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeStringDict(reader BytesReader) (Message, error) { - var err error = nil - msg := &StringDict{} - if msg.Key, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &StringDict{} + if msg.Key, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetNodeAttributeDict(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetNodeAttributeDict{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetNodeAttributeDict{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeResourceTimingDeprecatedDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &ResourceTimingDeprecatedDeprecated{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &ResourceTimingDeprecatedDeprecated{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.TTFB, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.HeaderSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.EncodedBodySize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.DecodedBodySize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Initiator, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeConnectionInformation(reader BytesReader) (Message, error) { - var err error = nil - msg := &ConnectionInformation{} - if msg.Downlink, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &ConnectionInformation{} + if msg.Downlink, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Type, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetPageVisibility(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetPageVisibility{} - if msg.hidden, err = reader.ReadBoolean(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &SetPageVisibility{} + if msg.hidden, err = reader.ReadBoolean(); err != nil { + return nil, err + } + return msg, err } func DecodePerformanceTrackAggr(reader BytesReader) (Message, error) { - var err error = nil - msg := &PerformanceTrackAggr{} - if msg.TimestampStart, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &PerformanceTrackAggr{} + if msg.TimestampStart, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.TimestampEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MinFPS, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.AvgFPS, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MaxFPS, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MinCPU, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.AvgCPU, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MaxCPU, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MinTotalJSHeapSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.AvgTotalJSHeapSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MaxTotalJSHeapSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MinUsedJSHeapSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.AvgUsedJSHeapSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MaxUsedJSHeapSize, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeLoadFontFace(reader BytesReader) (Message, error) { - var err error = nil - msg := &LoadFontFace{} - if msg.ParentID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &LoadFontFace{} + if msg.ParentID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Family, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Source, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Descriptors, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetNodeFocus(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetNodeFocus{} - if msg.ID, err = reader.ReadInt(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &SetNodeFocus{} + if msg.ID, err = reader.ReadInt(); err != nil { + return nil, err + } + return msg, err } func DecodeLongTask(reader BytesReader) (Message, error) { - var err error = nil - msg := &LongTask{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &LongTask{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Context, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ContainerType, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ContainerSrc, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.ContainerId, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.ContainerName, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetNodeAttributeURLBased(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetNodeAttributeURLBased{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetNodeAttributeURLBased{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.BaseURL, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetCSSDataURLBased(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetCSSDataURLBased{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SetCSSDataURLBased{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Data, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.BaseURL, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeIssueEventDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &IssueEventDeprecated{} - if msg.MessageID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &IssueEventDeprecated{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Type, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.ContextString, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Context, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Payload, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeTechnicalInfo(reader BytesReader) (Message, error) { - var err error = nil - msg := &TechnicalInfo{} - if msg.Type, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &TechnicalInfo{} + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeCustomIssue(reader BytesReader) (Message, error) { - var err error = nil - msg := &CustomIssue{} - if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &CustomIssue{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Payload, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeAssetCache(reader BytesReader) (Message, error) { - var err error = nil - msg := &AssetCache{} - if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &AssetCache{} + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err } func DecodeCSSInsertRuleURLBased(reader BytesReader) (Message, error) { - var err error = nil - msg := &CSSInsertRuleURLBased{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &CSSInsertRuleURLBased{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Rule, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Index, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.BaseURL, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMouseClick(reader BytesReader) (Message, error) { - var err error = nil - msg := &MouseClick{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MouseClick{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.HesitationTime, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Label, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Selector, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.NormalizedX, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.NormalizedY, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMouseClickDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &MouseClickDeprecated{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MouseClickDeprecated{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.HesitationTime, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Label, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Selector, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeCreateIFrameDocument(reader BytesReader) (Message, error) { - var err error = nil - msg := &CreateIFrameDocument{} - if msg.FrameID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &CreateIFrameDocument{} + if msg.FrameID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeAdoptedSSReplaceURLBased(reader BytesReader) (Message, error) { - var err error = nil - msg := &AdoptedSSReplaceURLBased{} - if msg.SheetID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &AdoptedSSReplaceURLBased{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Text, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.BaseURL, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeAdoptedSSReplace(reader BytesReader) (Message, error) { - var err error = nil - msg := &AdoptedSSReplace{} - if msg.SheetID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &AdoptedSSReplace{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Text, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeAdoptedSSInsertRuleURLBased(reader BytesReader) (Message, error) { - var err error = nil - msg := &AdoptedSSInsertRuleURLBased{} - if msg.SheetID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &AdoptedSSInsertRuleURLBased{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Rule, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Index, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.BaseURL, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeAdoptedSSInsertRule(reader BytesReader) (Message, error) { - var err error = nil - msg := &AdoptedSSInsertRule{} - if msg.SheetID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &AdoptedSSInsertRule{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Rule, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Index, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeAdoptedSSDeleteRule(reader BytesReader) (Message, error) { - var err error = nil - msg := &AdoptedSSDeleteRule{} - if msg.SheetID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &AdoptedSSDeleteRule{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Index, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeAdoptedSSAddOwner(reader BytesReader) (Message, error) { - var err error = nil - msg := &AdoptedSSAddOwner{} - if msg.SheetID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &AdoptedSSAddOwner{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeAdoptedSSRemoveOwner(reader BytesReader) (Message, error) { - var err error = nil - msg := &AdoptedSSRemoveOwner{} - if msg.SheetID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &AdoptedSSRemoveOwner{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeJSException(reader BytesReader) (Message, error) { - var err error = nil - msg := &JSException{} - if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &JSException{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Message, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Payload, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Metadata, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeZustand(reader BytesReader) (Message, error) { - var err error = nil - msg := &Zustand{} - if msg.Mutation, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &Zustand{} + if msg.Mutation, err = reader.ReadString(); err != nil { + return nil, err + } if msg.State, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeBatchMeta(reader BytesReader) (Message, error) { - var err error = nil - msg := &BatchMeta{} - if msg.PageNo, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &BatchMeta{} + if msg.PageNo, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.FirstIndex, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Timestamp, err = reader.ReadInt(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeBatchMetadata(reader BytesReader) (Message, error) { - var err error = nil - msg := &BatchMetadata{} - if msg.Version, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &BatchMetadata{} + if msg.Version, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.PageNo, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.FirstIndex, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Timestamp, err = reader.ReadInt(); err != nil { - return nil, err - } + return nil, err + } if msg.Location, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodePartitionedMessage(reader BytesReader) (Message, error) { - var err error = nil - msg := &PartitionedMessage{} - if msg.PartNo, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &PartitionedMessage{} + if msg.PartNo, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.PartTotal, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeNetworkRequest(reader BytesReader) (Message, error) { - var err error = nil - msg := &NetworkRequest{} - if msg.Type, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &NetworkRequest{} + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Method, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Request, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Response, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Status, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.TransferredBodySize, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeWSChannel(reader BytesReader) (Message, error) { - var err error = nil - msg := &WSChannel{} - if msg.ChType, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &WSChannel{} + if msg.ChType, err = reader.ReadString(); err != nil { + return nil, err + } if msg.ChannelName, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Data, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Dir, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.MessageType, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeResourceTiming(reader BytesReader) (Message, error) { - var err error = nil - msg := &ResourceTiming{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &ResourceTiming{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.TTFB, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.HeaderSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.EncodedBodySize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.DecodedBodySize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Initiator, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.TransferredSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Cached, err = reader.ReadBoolean(); err != nil { - return nil, err - } + return nil, err + } if msg.Queueing, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.DnsLookup, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.InitialConnection, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.SSL, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ContentDownload, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Total, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Stalled, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err +} + +func DecodeIncident(reader BytesReader) (Message, error) { + var err error = nil + msg := &Incident{} + if msg.Label, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.StartTime, err = reader.ReadInt(); err != nil { + return nil, err + } + if msg.EndTime, err = reader.ReadInt(); err != nil { + return nil, err + } + return msg, err } func DecodeLongAnimationTask(reader BytesReader) (Message, error) { - var err error = nil - msg := &LongAnimationTask{} - if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &LongAnimationTask{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Duration, err = reader.ReadInt(); err != nil { - return nil, err - } + return nil, err + } if msg.BlockingDuration, err = reader.ReadInt(); err != nil { - return nil, err - } + return nil, err + } if msg.FirstUIEventTimestamp, err = reader.ReadInt(); err != nil { - return nil, err - } + return nil, err + } if msg.StartTime, err = reader.ReadInt(); err != nil { - return nil, err - } + return nil, err + } if msg.Scripts, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeInputChange(reader BytesReader) (Message, error) { - var err error = nil - msg := &InputChange{} - if msg.ID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &InputChange{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.ValueMasked, err = reader.ReadBoolean(); err != nil { - return nil, err - } + return nil, err + } if msg.Label, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.HesitationTime, err = reader.ReadInt(); err != nil { - return nil, err - } + return nil, err + } if msg.InputDuration, err = reader.ReadInt(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSelectionChange(reader BytesReader) (Message, error) { - var err error = nil - msg := &SelectionChange{} - if msg.SelectionStart, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SelectionChange{} + if msg.SelectionStart, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.SelectionEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Selection, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMouseThrashing(reader BytesReader) (Message, error) { - var err error = nil - msg := &MouseThrashing{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &MouseThrashing{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err } func DecodeUnbindNodes(reader BytesReader) (Message, error) { - var err error = nil - msg := &UnbindNodes{} - if msg.TotalRemovedPercent, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &UnbindNodes{} + if msg.TotalRemovedPercent, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err } func DecodeResourceTimingDeprecated(reader BytesReader) (Message, error) { - var err error = nil - msg := &ResourceTimingDeprecated{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &ResourceTimingDeprecated{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.TTFB, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.HeaderSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.EncodedBodySize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.DecodedBodySize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Initiator, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.TransferredSize, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Cached, err = reader.ReadBoolean(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeTabChange(reader BytesReader) (Message, error) { - var err error = nil - msg := &TabChange{} - if msg.TabId, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &TabChange{} + if msg.TabId, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err } func DecodeTabData(reader BytesReader) (Message, error) { - var err error = nil - msg := &TabData{} - if msg.TabId, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &TabData{} + if msg.TabId, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err } func DecodeCanvasNode(reader BytesReader) (Message, error) { - var err error = nil - msg := &CanvasNode{} - if msg.NodeId, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &CanvasNode{} + if msg.NodeId, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeTagTrigger(reader BytesReader) (Message, error) { - var err error = nil - msg := &TagTrigger{} - if msg.TagId, err = reader.ReadInt(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &TagTrigger{} + if msg.TagId, err = reader.ReadInt(); err != nil { + return nil, err + } + return msg, err } func DecodeRedux(reader BytesReader) (Message, error) { - var err error = nil - msg := &Redux{} - if msg.Action, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &Redux{} + if msg.Action, err = reader.ReadString(); err != nil { + return nil, err + } if msg.State, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ActionTime, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSetPageLocation(reader BytesReader) (Message, error) { - var err error = nil - msg := &SetPageLocation{} - if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &SetPageLocation{} + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Referrer, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.NavigationStart, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.DocumentTitle, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeGraphQL(reader BytesReader) (Message, error) { - var err error = nil - msg := &GraphQL{} - if msg.OperationKind, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &GraphQL{} + if msg.OperationKind, err = reader.ReadString(); err != nil { + return nil, err + } if msg.OperationName, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Variables, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Response, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeWebVitals(reader BytesReader) (Message, error) { - var err error = nil - msg := &WebVitals{} - if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + var err error = nil + msg := &WebVitals{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeIssueEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &IssueEvent{} - if msg.MessageID, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &IssueEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Type, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.ContextString, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Context, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Payload, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSessionEnd(reader BytesReader) (Message, error) { - var err error = nil - msg := &SessionEnd{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SessionEnd{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.EncryptionKey, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeSessionSearch(reader BytesReader) (Message, error) { - var err error = nil - msg := &SessionSearch{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &SessionSearch{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Partition, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileSessionStart(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileSessionStart{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileSessionStart{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.ProjectID, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.TrackerVersion, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.RevID, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserUUID, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserOS, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserOSVersion, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserDevice, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserDeviceType, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.UserCountry, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileSessionEnd(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileSessionEnd{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + var err error = nil + msg := &MobileSessionEnd{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err } func DecodeMobileMetadata(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileMetadata{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileMetadata{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Key, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileEvent{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Payload, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileUserID(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileUserID{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileUserID{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ID, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileUserAnonymousID(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileUserAnonymousID{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileUserAnonymousID{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ID, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileScreenChanges(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileScreenChanges{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileScreenChanges{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.X, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Y, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Width, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Height, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileCrash(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileCrash{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileCrash{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Reason, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Stacktrace, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileViewComponentEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileViewComponentEvent{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileViewComponentEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.ScreenName, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.ViewName, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Visible, err = reader.ReadBoolean(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileClickEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileClickEvent{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileClickEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Label, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.X, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Y, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileInputEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileInputEvent{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileInputEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Value, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.ValueMasked, err = reader.ReadBoolean(); err != nil { - return nil, err - } + return nil, err + } if msg.Label, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobilePerformanceEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobilePerformanceEvent{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobilePerformanceEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Name, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Value, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileLog(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileLog{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileLog{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Severity, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Content, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileInternalError(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileInternalError{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileInternalError{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Content, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileNetworkCall(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileNetworkCall{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileNetworkCall{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Type, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Method, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.URL, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Request, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Response, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Status, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Duration, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileSwipeEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileSwipeEvent{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileSwipeEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Label, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.X, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Y, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.Direction, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileBatchMeta(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileBatchMeta{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileBatchMeta{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Length, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.FirstIndex, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobilePerformanceAggregated(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobilePerformanceAggregated{} - if msg.TimestampStart, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobilePerformanceAggregated{} + if msg.TimestampStart, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.TimestampEnd, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MinFPS, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.AvgFPS, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MaxFPS, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MinCPU, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.AvgCPU, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MaxCPU, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MinMemory, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.AvgMemory, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MaxMemory, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MinBattery, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.AvgBattery, err = reader.ReadUint(); err != nil { - return nil, err - } + return nil, err + } if msg.MaxBattery, err = reader.ReadUint(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func DecodeMobileIssueEvent(reader BytesReader) (Message, error) { - var err error = nil - msg := &MobileIssueEvent{} - if msg.Timestamp, err = reader.ReadUint(); err != nil { - return nil, err - } + var err error = nil + msg := &MobileIssueEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } if msg.Type, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.ContextString, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Context, err = reader.ReadString(); err != nil { - return nil, err - } + return nil, err + } if msg.Payload, err = reader.ReadString(); err != nil { - return nil, err - } - return msg, err + return nil, err + } + return msg, err } func ReadMessage(t uint64, reader BytesReader) (Message, error) { @@ -2331,6 +2346,8 @@ func ReadMessage(t uint64, reader BytesReader) (Message, error) { return DecodeWSChannel(reader) case 85: return DecodeResourceTiming(reader) + case 87: + return DecodeIncident(reader) case 89: return DecodeLongAnimationTask(reader) case 112: diff --git a/ee/connectors/msgcodec/messages.py b/ee/connectors/msgcodec/messages.py index 7aabdc46f..83030ef62 100644 --- a/ee/connectors/msgcodec/messages.py +++ b/ee/connectors/msgcodec/messages.py @@ -829,6 +829,15 @@ class ResourceTiming(Message): self.stalled = stalled +class Incident(Message): + __id__ = 87 + + def __init__(self, label, start_time, end_time): + self.label = label + self.start_time = start_time + self.end_time = end_time + + class LongAnimationTask(Message): __id__ = 89 diff --git a/ee/connectors/msgcodec/messages.pyx b/ee/connectors/msgcodec/messages.pyx index 1c9893ef8..800160971 100644 --- a/ee/connectors/msgcodec/messages.pyx +++ b/ee/connectors/msgcodec/messages.pyx @@ -1241,6 +1241,19 @@ cdef class ResourceTiming(PyMessage): self.stalled = stalled +cdef class Incident(PyMessage): + cdef public int __id__ + cdef public str label + cdef public long start_time + cdef public long end_time + + def __init__(self, str label, long start_time, long end_time): + self.__id__ = 87 + self.label = label + self.start_time = start_time + self.end_time = end_time + + cdef class LongAnimationTask(PyMessage): cdef public int __id__ cdef public str name diff --git a/ee/connectors/msgcodec/msgcodec.py b/ee/connectors/msgcodec/msgcodec.py index 5db27b325..43926ed5c 100644 --- a/ee/connectors/msgcodec/msgcodec.py +++ b/ee/connectors/msgcodec/msgcodec.py @@ -750,6 +750,13 @@ class MessageCodec(Codec): stalled=self.read_uint(reader) ) + if message_id == 87: + return Incident( + label=self.read_string(reader), + start_time=self.read_int(reader), + end_time=self.read_int(reader) + ) + if message_id == 89: return LongAnimationTask( name=self.read_string(reader), diff --git a/ee/connectors/msgcodec/msgcodec.pyx b/ee/connectors/msgcodec/msgcodec.pyx index 7b8fcb976..cfdeaf8f6 100644 --- a/ee/connectors/msgcodec/msgcodec.pyx +++ b/ee/connectors/msgcodec/msgcodec.pyx @@ -848,6 +848,13 @@ cdef class MessageCodec: stalled=self.read_uint(reader) ) + if message_id == 87: + return Incident( + label=self.read_string(reader), + start_time=self.read_int(reader), + end_time=self.read_int(reader) + ) + if message_id == 89: return LongAnimationTask( name=self.read_string(reader), diff --git a/frontend/app/components/Session_/EventsBlock/EventGroupWrapper.tsx b/frontend/app/components/Session_/EventsBlock/EventGroupWrapper.tsx index 92f89bcea..10a404c6e 100644 --- a/frontend/app/components/Session_/EventsBlock/EventGroupWrapper.tsx +++ b/frontend/app/components/Session_/EventsBlock/EventGroupWrapper.tsx @@ -1,5 +1,5 @@ import { TYPES } from 'Types/session/event'; -import React from 'react'; +import React, { useMemo } from 'react'; import { observer } from 'mobx-react-lite'; import { useStore } from 'App/mstore'; import UxtEvent from 'Components/Session_/EventsBlock/UxtEvent'; @@ -32,6 +32,7 @@ function EventGroupWrapper(props) { presentInSearch, isNote, isTabChange, + isIncident, filterOutNote, } = props; const { t } = useTranslation(); @@ -57,6 +58,15 @@ function EventGroupWrapper(props) { /> ); } + if (isIncident) { + return ( + + ) + } if (isLocation) { return ( { + if (isSearched) { + return '#F0A930'; + } + if (props.isPrev) { + return '#A7BFFF'; + } + if (props.isCurrent) { + return '#394EFF'; + } + return 'transparent'; + }, [isSearched, props.isPrev, props.isCurrent]); + return ( <>
@@ -172,4 +190,22 @@ function TabChange({ from, to, activeUrl, onClick }) { ); }; +function Incident({ label, onClick }: { label: string; onClick: () => void }) { + const { t } = useTranslation(); + return ( +
+
+ +
+ {t('Incident')} + {label} +
+
+
+ ); +}; + export default observer(EventGroupWrapper); diff --git a/frontend/app/components/Session_/EventsBlock/EventsBlock.tsx b/frontend/app/components/Session_/EventsBlock/EventsBlock.tsx index b9240c12b..19988dc73 100644 --- a/frontend/app/components/Session_/EventsBlock/EventsBlock.tsx +++ b/frontend/app/components/Session_/EventsBlock/EventsBlock.tsx @@ -34,8 +34,9 @@ function EventsBlock(props: IProps) { const { notesStore, uxtestingStore, uiPlayerStore, sessionStore } = useStore(); const session = sessionStore.current; - const { notesWithEvents } = session; - const { uxtVideo } = session; + const notesWithEvents = session.notesWithEvents; + const incidents = session.incidents; + const uxtVideo = session.uxtVideo; const { filteredEvents } = sessionStore; const query = sessionStore.eventsQuery; const { eventsIndex } = sessionStore; @@ -86,26 +87,28 @@ function EventsBlock(props: IProps) { } }); } - const eventsWithMobxNotes = [...notesWithEvents, ...notes] - .sort(sortEvents); + const eventsWithMobxNotes = [...incidents, ...notesWithEvents, ...notes, ].sort(sortEvents); const filteredTabEvents = query.length - ? tabChangeEvents - .filter((e => (e.activeUrl as string).includes(query))) - : tabChangeEvents; - const list = mergeEventLists( - query.length > 0 ? filteredEvents : eventsWithMobxNotes, - filteredTabEvents + ? tabChangeEvents.filter((e) => (e.activeUrl as string).includes(query)) + : tabChangeEvents; + return mergeEventLists( + filteredLength > 0 ? filteredEvents : eventsWithMobxNotes, + tabChangeEvents, ) - if (zoomEnabled) { - return list.filter((e) => + .filter((e) => zoomEnabled - ? 'time' in e - ? e.time >= zoomStartTs && e.time <= zoomEndTs - : false - : true - ).filter((e: any) => !e.noteId && e.type !== 'TABCHANGE' && uiPlayerStore.showOnlySearchEvents ? e.isHighlighted : true); - } - return list; + ? 'time' in e + ? e.time >= zoomStartTs && e.time <= zoomEndTs + : false + : true, + ) + .filter((e: any) => + !e.noteId && + e.type !== 'TABCHANGE' && + uiPlayerStore.showOnlySearchEvents + ? e.isHighlighted + : true, + ); }, [ filteredLength, query, @@ -114,15 +117,17 @@ function EventsBlock(props: IProps) { zoomEnabled, zoomStartTs, zoomEndTs, - uiPlayerStore.showOnlySearchEvents + uiPlayerStore.showOnlySearchEvents, ]); + const findLastFitting = React.useCallback( (time: number) => { - if (!usedEvents.length) return 0; - let i = usedEvents.length - 1; + const allEvents = usedEvents.concat(incidents); + if (!allEvents.length) return 0; + let i = allEvents.length - 1; if (time > endTime / 2) { - while (i >= 0) { - const event = usedEvents[i]; + while (i > 0) { + const event = allEvents[i]; if ('time' in event && event.time <= time) break; i--; } @@ -130,18 +135,18 @@ function EventsBlock(props: IProps) { } let l = 0; while (l < i) { - const event = usedEvents[l]; + const event = allEvents[l]; if ('time' in event && event.time >= time) break; l++; } return l; }, - [usedEvents, time, endTime], + [usedEvents, incidents, time, endTime], ); useEffect(() => { setCurrentTimeEventIndex(findLastFitting(time)); - }, []) + }, [time]); const write = ({ target: { value }, @@ -195,9 +200,10 @@ function EventsBlock(props: IProps) { const event = usedEvents[index]; const isNote = 'noteId' in event; const isTabChange = 'type' in event && event.type === 'TABCHANGE'; + const isIncident = 'type' in event && event.type === 'INCIDENT'; const isCurrent = index === currentTimeEventIndex; const isPrev = index < currentTimeEventIndex; - const isSearched = event.isHighlighted + const isSearched = event.isHighlighted; return ( Object.values(tabStates)[0]?.eventList.filter((e) => { @@ -39,10 +41,25 @@ function EventsList() {
))} + {incidents.map((i) => { + const width = getTimelineEventWidth(endTime, (i as any).time, (i as any).endTime - sessionStart); + return ( + +
+ + ) + })} ); } diff --git a/frontend/app/components/Session_/Player/Controls/getTimelineEventWidth.ts b/frontend/app/components/Session_/Player/Controls/getTimelineEventWidth.ts new file mode 100644 index 000000000..954eaaf33 --- /dev/null +++ b/frontend/app/components/Session_/Player/Controls/getTimelineEventWidth.ts @@ -0,0 +1,21 @@ +import { getTimelinePosition } from '@/utils'; + +export function getTimelineEventWidth( + sessionDuration: number, + eventStart: number, + eventEnd: number, +): number | string { + if (eventStart < 0) { + eventStart = 0; + } + if (eventEnd > sessionDuration) { + eventEnd = sessionDuration; + } + if (eventStart === eventEnd) { + return '2px'; + } + + const width = ((eventEnd - eventStart) / sessionDuration) * 100; + + return width < 1 ? '4px' : width; +} diff --git a/frontend/app/components/shared/SessionsTabOverview/components/SessionTags/SessionTags.tsx b/frontend/app/components/shared/SessionsTabOverview/components/SessionTags/SessionTags.tsx index 018e0b389..a84f5cae4 100644 --- a/frontend/app/components/shared/SessionsTabOverview/components/SessionTags/SessionTags.tsx +++ b/frontend/app/components/shared/SessionsTabOverview/components/SessionTags/SessionTags.tsx @@ -1,6 +1,6 @@ import { issues_types, types } from 'Types/session/issue'; import { Grid, Segmented } from 'antd'; -import { Angry, CircleAlert, Skull, WifiOff, ChevronDown } from 'lucide-react'; +import { Angry, CircleAlert, Skull, WifiOff, ChevronDown, MessageCircleWarning } from 'lucide-react'; import { observer } from 'mobx-react-lite'; import React, { useState, useEffect, useRef } from 'react'; import { useStore } from 'App/mstore'; @@ -15,6 +15,7 @@ const tagIcons = { [types.CLICK_RAGE]: , [types.CRASH]: , [types.TAP_RAGE]: , + [types.INCIDENT]: , } as Record; function SessionTags() { diff --git a/frontend/app/components/ui/Icons/funnel_message_circle_warning.tsx b/frontend/app/components/ui/Icons/funnel_message_circle_warning.tsx new file mode 100644 index 000000000..2789a8f3d --- /dev/null +++ b/frontend/app/components/ui/Icons/funnel_message_circle_warning.tsx @@ -0,0 +1,18 @@ +/* Auto-generated, do not edit */ +import React from 'react'; + +interface Props { + size?: number | string; + width?: number | string; + height?: number | string; + fill?: string; +} + +function Funnel_message_circle_warning(props: Props) { + const { size = 14, width = size, height = size, fill = '' } = props; + return ( + + ); +} + +export default Funnel_message_circle_warning; diff --git a/frontend/app/components/ui/Icons/index.ts b/frontend/app/components/ui/Icons/index.ts index 849046c42..225deb1b0 100644 --- a/frontend/app/components/ui/Icons/index.ts +++ b/frontend/app/components/ui/Icons/index.ts @@ -289,6 +289,7 @@ export { default as Funnel_hdd_fill } from './funnel_hdd_fill'; export { default as Funnel_hourglass_top } from './funnel_hourglass_top'; export { default as Funnel_image_fill } from './funnel_image_fill'; export { default as Funnel_image } from './funnel_image'; +export { default as Funnel_message_circle_warning } from './funnel_message_circle_warning'; export { default as Funnel_microchip } from './funnel_microchip'; export { default as Funnel_mouse } from './funnel_mouse'; export { default as Funnel_patch_exclamation_fill } from './funnel_patch_exclamation_fill'; diff --git a/frontend/app/components/ui/SVG.tsx b/frontend/app/components/ui/SVG.tsx index a9ebb6839..4cec3d10f 100644 --- a/frontend/app/components/ui/SVG.tsx +++ b/frontend/app/components/ui/SVG.tsx @@ -291,6 +291,7 @@ import { Funnel_hourglass_top, Funnel_image_fill, Funnel_image, + Funnel_message_circle_warning, Funnel_microchip, Funnel_mouse, Funnel_patch_exclamation_fill, @@ -1371,6 +1372,9 @@ const SVG = (props: Props) => { // case 'funnel/image': case 'funnel/image': return ; + // case 'funnel/message-circle-warning': + case 'funnel/message-circle-warning': return ; + // case 'funnel/microchip': case 'funnel/microchip': return ; diff --git a/frontend/app/mstore/sessionStore.ts b/frontend/app/mstore/sessionStore.ts index c283a465f..42b4161ce 100644 --- a/frontend/app/mstore/sessionStore.ts +++ b/frontend/app/mstore/sessionStore.ts @@ -344,7 +344,7 @@ export default class SessionStore { events: evData.events.map((e) => ({ ...e, isHighlighted: checkEventWithFilters(e, searchStore.instance.filters) - })) + })), }); } catch (e) { console.error('Failed to fetch events', e); @@ -359,6 +359,7 @@ export default class SessionStore { stackEvents = [], userEvents = [], userTesting = [], + incidents = [], } = eventsData; const filterEvents = filter.events as Record[]; @@ -399,6 +400,7 @@ export default class SessionStore { userEvents, stackEvents, userTesting, + incidents, ); this.current = session; this.eventsIndex = matching; diff --git a/frontend/app/player/web/Lists.ts b/frontend/app/player/web/Lists.ts index 0d4914c7c..4cfdab840 100644 --- a/frontend/app/player/web/Lists.ts +++ b/frontend/app/player/web/Lists.ts @@ -62,6 +62,7 @@ const SIMPLE_LIST_NAMES = [ 'exceptions', 'profiles', 'frustrations', + 'incidents', ] as const; const MARKED_LIST_NAMES = [ 'log', diff --git a/frontend/app/player/web/messages/RawMessageReader.gen.ts b/frontend/app/player/web/messages/RawMessageReader.gen.ts index 54c9d29c2..9d364ae34 100644 --- a/frontend/app/player/web/messages/RawMessageReader.gen.ts +++ b/frontend/app/player/web/messages/RawMessageReader.gen.ts @@ -773,6 +773,18 @@ export default class RawMessageReader extends PrimitiveReader { }; } + case 87: { + const label = this.readString(); if (label === null) { return resetPointer() } + const startTime = this.readInt(); if (startTime === null) { return resetPointer() } + const endTime = this.readInt(); if (endTime === null) { return resetPointer() } + return { + tp: MType.Incident, + label, + startTime, + endTime, + }; + } + case 89: { const name = this.readString(); if (name === null) { return resetPointer() } const duration = this.readInt(); if (duration === null) { return resetPointer() } diff --git a/frontend/app/player/web/messages/message.gen.ts b/frontend/app/player/web/messages/message.gen.ts index 32d4d3df1..2a2bc73ee 100644 --- a/frontend/app/player/web/messages/message.gen.ts +++ b/frontend/app/player/web/messages/message.gen.ts @@ -63,6 +63,7 @@ import type { RawNetworkRequest, RawWsChannel, RawResourceTiming, + RawIncident, RawLongAnimationTask, RawSelectionChange, RawMouseThrashing, @@ -207,6 +208,8 @@ export type WsChannel = RawWsChannel & Timed export type ResourceTiming = RawResourceTiming & Timed +export type Incident = RawIncident & Timed + export type LongAnimationTask = RawLongAnimationTask & Timed export type SelectionChange = RawSelectionChange & Timed diff --git a/frontend/app/player/web/messages/raw.gen.ts b/frontend/app/player/web/messages/raw.gen.ts index e6ca247e2..b04064c8d 100644 --- a/frontend/app/player/web/messages/raw.gen.ts +++ b/frontend/app/player/web/messages/raw.gen.ts @@ -61,6 +61,7 @@ export const enum MType { NetworkRequest = 83, WsChannel = 84, ResourceTiming = 85, + Incident = 87, LongAnimationTask = 89, SelectionChange = 113, MouseThrashing = 114, @@ -521,6 +522,13 @@ export interface RawResourceTiming { stalled: number, } +export interface RawIncident { + tp: MType.Incident, + label: string, + startTime: number, + endTime: number, +} + export interface RawLongAnimationTask { tp: MType.LongAnimationTask, name: string, @@ -695,4 +703,4 @@ export interface RawMobileIssueEvent { } -export type RawMessage = RawTimestamp | RawSetPageLocationDeprecated | RawSetViewportSize | RawSetViewportScroll | RawCreateDocument | RawCreateElementNode | RawCreateTextNode | RawMoveNode | RawRemoveNode | RawSetNodeAttribute | RawRemoveNodeAttribute | RawSetNodeData | RawSetCssData | RawSetNodeScroll | RawSetInputValue | RawSetInputChecked | RawMouseMove | RawNetworkRequestDeprecated | RawConsoleLog | RawStringDictGlobal | RawSetNodeAttributeDictGlobal | RawCssInsertRule | RawCssDeleteRule | RawFetch | RawProfiler | RawOTable | RawReduxDeprecated | RawVuex | RawMobX | RawNgRx | RawGraphQlDeprecated | RawPerformanceTrack | RawStringDictDeprecated | RawSetNodeAttributeDictDeprecated | RawStringDict | RawSetNodeAttributeDict | RawResourceTimingDeprecatedDeprecated | RawConnectionInformation | RawSetPageVisibility | RawLoadFontFace | RawSetNodeFocus | RawLongTask | RawSetNodeAttributeURLBased | RawSetCssDataURLBased | RawCssInsertRuleURLBased | RawMouseClick | RawMouseClickDeprecated | RawCreateIFrameDocument | RawAdoptedSsReplaceURLBased | RawAdoptedSsReplace | RawAdoptedSsInsertRuleURLBased | RawAdoptedSsInsertRule | RawAdoptedSsDeleteRule | RawAdoptedSsAddOwner | RawAdoptedSsRemoveOwner | RawZustand | RawNetworkRequest | RawWsChannel | RawResourceTiming | RawLongAnimationTask | RawSelectionChange | RawMouseThrashing | RawResourceTimingDeprecated | RawTabChange | RawTabData | RawCanvasNode | RawTagTrigger | RawRedux | RawSetPageLocation | RawGraphQl | RawMobileEvent | RawMobileScreenChanges | RawMobileClickEvent | RawMobileInputEvent | RawMobilePerformanceEvent | RawMobileLog | RawMobileInternalError | RawMobileNetworkCall | RawMobileSwipeEvent | RawMobileIssueEvent; +export type RawMessage = RawTimestamp | RawSetPageLocationDeprecated | RawSetViewportSize | RawSetViewportScroll | RawCreateDocument | RawCreateElementNode | RawCreateTextNode | RawMoveNode | RawRemoveNode | RawSetNodeAttribute | RawRemoveNodeAttribute | RawSetNodeData | RawSetCssData | RawSetNodeScroll | RawSetInputValue | RawSetInputChecked | RawMouseMove | RawNetworkRequestDeprecated | RawConsoleLog | RawStringDictGlobal | RawSetNodeAttributeDictGlobal | RawCssInsertRule | RawCssDeleteRule | RawFetch | RawProfiler | RawOTable | RawReduxDeprecated | RawVuex | RawMobX | RawNgRx | RawGraphQlDeprecated | RawPerformanceTrack | RawStringDictDeprecated | RawSetNodeAttributeDictDeprecated | RawStringDict | RawSetNodeAttributeDict | RawResourceTimingDeprecatedDeprecated | RawConnectionInformation | RawSetPageVisibility | RawLoadFontFace | RawSetNodeFocus | RawLongTask | RawSetNodeAttributeURLBased | RawSetCssDataURLBased | RawCssInsertRuleURLBased | RawMouseClick | RawMouseClickDeprecated | RawCreateIFrameDocument | RawAdoptedSsReplaceURLBased | RawAdoptedSsReplace | RawAdoptedSsInsertRuleURLBased | RawAdoptedSsInsertRule | RawAdoptedSsDeleteRule | RawAdoptedSsAddOwner | RawAdoptedSsRemoveOwner | RawZustand | RawNetworkRequest | RawWsChannel | RawResourceTiming | RawIncident | RawLongAnimationTask | RawSelectionChange | RawMouseThrashing | RawResourceTimingDeprecated | RawTabChange | RawTabData | RawCanvasNode | RawTagTrigger | RawRedux | RawSetPageLocation | RawGraphQl | RawMobileEvent | RawMobileScreenChanges | RawMobileClickEvent | RawMobileInputEvent | RawMobilePerformanceEvent | RawMobileLog | RawMobileInternalError | RawMobileNetworkCall | RawMobileSwipeEvent | RawMobileIssueEvent; diff --git a/frontend/app/player/web/messages/tracker-legacy.gen.ts b/frontend/app/player/web/messages/tracker-legacy.gen.ts index cef13cce6..ccbdc11a0 100644 --- a/frontend/app/player/web/messages/tracker-legacy.gen.ts +++ b/frontend/app/player/web/messages/tracker-legacy.gen.ts @@ -62,6 +62,7 @@ export const TP_MAP = { 83: MType.NetworkRequest, 84: MType.WsChannel, 85: MType.ResourceTiming, + 87: MType.Incident, 89: MType.LongAnimationTask, 113: MType.SelectionChange, 114: MType.MouseThrashing, diff --git a/frontend/app/player/web/messages/tracker.gen.ts b/frontend/app/player/web/messages/tracker.gen.ts index 0c6958268..4607f9860 100644 --- a/frontend/app/player/web/messages/tracker.gen.ts +++ b/frontend/app/player/web/messages/tracker.gen.ts @@ -510,6 +510,13 @@ type TrResourceTiming = [ stalled: number, ] +type TrIncident = [ + type: 87, + label: string, + startTime: number, + endTime: number, +] + type TrLongAnimationTask = [ type: 89, name: string, @@ -614,7 +621,7 @@ type TrWebVitals = [ ] -export type TrackerMessage = TrTimestamp | TrSetPageLocationDeprecated | TrSetViewportSize | TrSetViewportScroll | TrCreateDocument | TrCreateElementNode | TrCreateTextNode | TrMoveNode | TrRemoveNode | TrSetNodeAttribute | TrRemoveNodeAttribute | TrSetNodeData | TrSetNodeScroll | TrSetInputTarget | TrSetInputValue | TrSetInputChecked | TrMouseMove | TrNetworkRequestDeprecated | TrConsoleLog | TrPageLoadTiming | TrPageRenderTiming | TrCustomEvent | TrUserID | TrUserAnonymousID | TrMetadata | TrStringDictGlobal | TrSetNodeAttributeDictGlobal | TrCSSInsertRule | TrCSSDeleteRule | TrFetch | TrProfiler | TrOTable | TrStateAction | TrReduxDeprecated | TrVuex | TrMobX | TrNgRx | TrGraphQLDeprecated | TrPerformanceTrack | TrStringDictDeprecated | TrSetNodeAttributeDictDeprecated | TrStringDict | TrSetNodeAttributeDict | TrResourceTimingDeprecatedDeprecated | TrConnectionInformation | TrSetPageVisibility | TrLoadFontFace | TrSetNodeFocus | TrLongTask | TrSetNodeAttributeURLBased | TrSetCSSDataURLBased | TrTechnicalInfo | TrCustomIssue | TrCSSInsertRuleURLBased | TrMouseClick | TrMouseClickDeprecated | TrCreateIFrameDocument | TrAdoptedSSReplaceURLBased | TrAdoptedSSInsertRuleURLBased | TrAdoptedSSDeleteRule | TrAdoptedSSAddOwner | TrAdoptedSSRemoveOwner | TrJSException | TrZustand | TrBatchMetadata | TrPartitionedMessage | TrNetworkRequest | TrWSChannel | TrResourceTiming | TrLongAnimationTask | TrInputChange | TrSelectionChange | TrMouseThrashing | TrUnbindNodes | TrResourceTimingDeprecated | TrTabChange | TrTabData | TrCanvasNode | TrTagTrigger | TrRedux | TrSetPageLocation | TrGraphQL | TrWebVitals +export type TrackerMessage = TrTimestamp | TrSetPageLocationDeprecated | TrSetViewportSize | TrSetViewportScroll | TrCreateDocument | TrCreateElementNode | TrCreateTextNode | TrMoveNode | TrRemoveNode | TrSetNodeAttribute | TrRemoveNodeAttribute | TrSetNodeData | TrSetNodeScroll | TrSetInputTarget | TrSetInputValue | TrSetInputChecked | TrMouseMove | TrNetworkRequestDeprecated | TrConsoleLog | TrPageLoadTiming | TrPageRenderTiming | TrCustomEvent | TrUserID | TrUserAnonymousID | TrMetadata | TrStringDictGlobal | TrSetNodeAttributeDictGlobal | TrCSSInsertRule | TrCSSDeleteRule | TrFetch | TrProfiler | TrOTable | TrStateAction | TrReduxDeprecated | TrVuex | TrMobX | TrNgRx | TrGraphQLDeprecated | TrPerformanceTrack | TrStringDictDeprecated | TrSetNodeAttributeDictDeprecated | TrStringDict | TrSetNodeAttributeDict | TrResourceTimingDeprecatedDeprecated | TrConnectionInformation | TrSetPageVisibility | TrLoadFontFace | TrSetNodeFocus | TrLongTask | TrSetNodeAttributeURLBased | TrSetCSSDataURLBased | TrTechnicalInfo | TrCustomIssue | TrCSSInsertRuleURLBased | TrMouseClick | TrMouseClickDeprecated | TrCreateIFrameDocument | TrAdoptedSSReplaceURLBased | TrAdoptedSSInsertRuleURLBased | TrAdoptedSSDeleteRule | TrAdoptedSSAddOwner | TrAdoptedSSRemoveOwner | TrJSException | TrZustand | TrBatchMetadata | TrPartitionedMessage | TrNetworkRequest | TrWSChannel | TrResourceTiming | TrIncident | TrLongAnimationTask | TrInputChange | TrSelectionChange | TrMouseThrashing | TrUnbindNodes | TrResourceTimingDeprecated | TrTabChange | TrTabData | TrCanvasNode | TrTagTrigger | TrRedux | TrSetPageLocation | TrGraphQL | TrWebVitals export default function translate(tMsg: TrackerMessage): RawMessage | null { switch(tMsg[0]) { @@ -1148,6 +1155,15 @@ export default function translate(tMsg: TrackerMessage): RawMessage | null { } } + case 87: { + return { + tp: MType.Incident, + label: tMsg[1], + startTime: tMsg[2], + endTime: tMsg[3], + } + } + case 89: { return { tp: MType.LongAnimationTask, diff --git a/frontend/app/svg/icons/funnel/message-circle-warning.svg b/frontend/app/svg/icons/funnel/message-circle-warning.svg new file mode 100644 index 000000000..723cfce0b --- /dev/null +++ b/frontend/app/svg/icons/funnel/message-circle-warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/app/types/session/event.ts b/frontend/app/types/session/event.ts index 2eeb568c4..b3435de85 100644 --- a/frontend/app/types/session/event.ts +++ b/frontend/app/types/session/event.ts @@ -10,6 +10,7 @@ const IOS_VIEW = 'VIEW'; const UXT_EVENT = 'UXT_EVENT'; const TOUCH = 'TAP'; const SWIPE = 'SWIPE'; +const INCIDENT = 'INCIDENT'; export const TYPES = { CONSOLE, @@ -24,6 +25,7 @@ export const TYPES = { SWIPE, TAPRAGE, UXT_EVENT, + INCIDENT, }; export type EventType = @@ -35,7 +37,8 @@ export type EventType = | typeof CLICKRAGE | typeof IOS_VIEW | typeof TOUCH - | typeof SWIPE; + | typeof SWIPE + | typeof INCIDENT interface IEvent { time: number; @@ -99,6 +102,12 @@ export interface LocationEvent extends IEvent { webVitals: string | null; } +export interface IncidentEvent extends IEvent { + label: string; + startTime: number; + endTime: number; +} + export type EventData = | ConsoleEvent | ClickEvent @@ -276,6 +285,21 @@ export class Location extends Event { } } +export class Incident extends Event { + readonly name = 'Incident'; + + readonly type = CUSTOM; + + constructor(evt: IncidentEvent) { + super(evt); + Object.assign(this, { + ...evt, + label: evt.label || 'User signaled an incident', + type: 'INCIDENT', + }); + } +} + export type InjectedEvent = | Console | Click @@ -283,7 +307,8 @@ export type InjectedEvent = | Location | Touch | Swipe - | UxtEvent; + | UxtEvent + | Incident; export default function (event: EventData) { if ('allow_typing' in event) { @@ -307,6 +332,8 @@ export default function (event: EventData) { return new Click(event as ClickEvent, true); case SWIPE: return new Swipe(event as SwipeEvent); + case INCIDENT: + return new Incident(event as IncidentEvent); default: return console.error(`Unknown event type: ${event.type}`); } diff --git a/frontend/app/types/session/issue.ts b/frontend/app/types/session/issue.ts index 6aaf1245b..3972eecef 100644 --- a/frontend/app/types/session/issue.ts +++ b/frontend/app/types/session/issue.ts @@ -1,4 +1,3 @@ -import i18next, { TFunction } from 'i18next'; import Record from 'Types/Record'; export const types = { @@ -10,6 +9,7 @@ export const types = { MOUSE_THRASHING: 'mouse_thrashing', TAP_RAGE: 'tap_rage', DEAD_CLICK: 'dead_click', + INCIDENT: 'incident', } as const; type TypeKeys = keyof typeof types; @@ -75,6 +75,14 @@ export const issues_types = [ name: 'Mouse Thrashing', icon: 'cursor-trash', }, + { + type: types.INCIDENT, + visible: true, + order: 7, + name: 'Incidents', + icon: 'funnel/message-circle-warning', + // isEvent: false, + } // { 'type': 'memory', 'visible': true, 'order': 4, 'name': 'High Memory', 'icon': 'funnel/sd-card' }, // { 'type': 'vault', 'visible': true, 'order': 5, 'name': 'Vault', 'icon': 'safe' }, // { 'type': 'bookmark', 'visible': true, 'order': 5, 'name': 'Bookmarks', 'icon': 'safe' }, diff --git a/frontend/app/types/session/session.ts b/frontend/app/types/session/session.ts index 8e578b99c..8c0b90d7e 100644 --- a/frontend/app/types/session/session.ts +++ b/frontend/app/types/session/session.ts @@ -1,7 +1,7 @@ import { Duration } from 'luxon'; import { Note } from 'App/services/NotesService'; import { toJS } from 'mobx'; -import SessionEvent, { TYPES, EventData, InjectedEvent } from './event'; +import SessionEvent, { TYPES, EventData, InjectedEvent, Incident } from './event'; import StackEvent from './stackEvent'; import SessionError, { IError } from './error'; import Issue, { IIssue, types as issueTypes } from './issue'; @@ -145,6 +145,7 @@ export interface ISession { isMobileNative?: boolean; audio?: string; assistOnly?: boolean; + incidents?: Array; } const emptyValues = { @@ -284,6 +285,8 @@ export default class Session { frustrations: Array; + incidents: Array + timezone?: ISession['timezone']; platform: ISession['platform']; @@ -329,6 +332,7 @@ export default class Session { canvasURL = [], uxtVideo = [], videoURL = [], + incidents = [], ...session } = sessionData; const duration = Duration.fromMillis( @@ -446,6 +450,7 @@ export default class Session { userEvents: any[] = [], stackEvents: any[] = [], userTestingEvents: any[] = [], + incidents: any[] = [], ) { const exceptions = (errors as IError[])?.map((e) => new SessionError(e)) || []; @@ -506,6 +511,11 @@ export default class Session { const frustrationList = [...frustrationEvents, ...frustrationIssues].sort(sortEvents) || []; + const incidentsList = incidents.sort((a, b) => a.startTime - b.startTime).map((i) => ({ + ...i, + time: i.startTime - this.startedAt, + })).map((i) => new Incident(i)); + const mixedEventsWithIssues = mergeEventLists( events, frustrationIssues.filter((i) => i.type !== issueTypes.DEAD_CLICK), @@ -524,6 +534,7 @@ export default class Session { this.frustrations = frustrationList; this.crashes = crashes || []; this.addedEvents = true; + this.incidents = incidentsList; return this; } diff --git a/mobs/messages.rb b/mobs/messages.rb index 2dddad994..c0a9bb0ea 100644 --- a/mobs/messages.rb +++ b/mobs/messages.rb @@ -542,6 +542,12 @@ message 85, 'ResourceTiming', :replayer => :devtools do uint 'Stalled' end +message 87, 'Incident', :replayer => :devtools do + string 'Label' + int 'StartTime' + int 'EndTime' +end + message 89, 'LongAnimationTask', :replayer => :devtools do string 'Name' int 'Duration' @@ -653,4 +659,4 @@ message 127, 'SessionSearch', :tracker => false, :replayer => false do uint 'Partition' end -# FREE 2, 35, 36, 65, 85, 86, 87, 88, 89 +# FREE 2, 35, 36, 65, 87, 88, 89 diff --git a/tracker/tracker/src/common/messages.gen.ts b/tracker/tracker/src/common/messages.gen.ts index 6ed1f3f82..e0b2251b9 100644 --- a/tracker/tracker/src/common/messages.gen.ts +++ b/tracker/tracker/src/common/messages.gen.ts @@ -71,6 +71,7 @@ export declare const enum Type { NetworkRequest = 83, WSChannel = 84, ResourceTiming = 85, + Incident = 87, LongAnimationTask = 89, InputChange = 112, SelectionChange = 113, @@ -593,6 +594,13 @@ export type ResourceTiming = [ /*stalled:*/ number, ] +export type Incident = [ + /*type:*/ Type.Incident, + /*label:*/ string, + /*startTime:*/ number, + /*endTime:*/ number, +] + export type LongAnimationTask = [ /*type:*/ Type.LongAnimationTask, /*name:*/ string, @@ -697,5 +705,5 @@ export type WebVitals = [ ] -type Message = Timestamp | SetPageLocationDeprecated | SetViewportSize | SetViewportScroll | CreateDocument | CreateElementNode | CreateTextNode | MoveNode | RemoveNode | SetNodeAttribute | RemoveNodeAttribute | SetNodeData | SetNodeScroll | SetInputTarget | SetInputValue | SetInputChecked | MouseMove | NetworkRequestDeprecated | ConsoleLog | PageLoadTiming | PageRenderTiming | CustomEvent | UserID | UserAnonymousID | Metadata | StringDictGlobal | SetNodeAttributeDictGlobal | CSSInsertRule | CSSDeleteRule | Fetch | Profiler | OTable | StateAction | ReduxDeprecated | Vuex | MobX | NgRx | GraphQLDeprecated | PerformanceTrack | StringDictDeprecated | SetNodeAttributeDictDeprecated | StringDict | SetNodeAttributeDict | ResourceTimingDeprecatedDeprecated | ConnectionInformation | SetPageVisibility | LoadFontFace | SetNodeFocus | LongTask | SetNodeAttributeURLBased | SetCSSDataURLBased | TechnicalInfo | CustomIssue | CSSInsertRuleURLBased | MouseClick | MouseClickDeprecated | CreateIFrameDocument | AdoptedSSReplaceURLBased | AdoptedSSInsertRuleURLBased | AdoptedSSDeleteRule | AdoptedSSAddOwner | AdoptedSSRemoveOwner | JSException | Zustand | BatchMetadata | PartitionedMessage | NetworkRequest | WSChannel | ResourceTiming | LongAnimationTask | InputChange | SelectionChange | MouseThrashing | UnbindNodes | ResourceTimingDeprecated | TabChange | TabData | CanvasNode | TagTrigger | Redux | SetPageLocation | GraphQL | WebVitals +type Message = Timestamp | SetPageLocationDeprecated | SetViewportSize | SetViewportScroll | CreateDocument | CreateElementNode | CreateTextNode | MoveNode | RemoveNode | SetNodeAttribute | RemoveNodeAttribute | SetNodeData | SetNodeScroll | SetInputTarget | SetInputValue | SetInputChecked | MouseMove | NetworkRequestDeprecated | ConsoleLog | PageLoadTiming | PageRenderTiming | CustomEvent | UserID | UserAnonymousID | Metadata | StringDictGlobal | SetNodeAttributeDictGlobal | CSSInsertRule | CSSDeleteRule | Fetch | Profiler | OTable | StateAction | ReduxDeprecated | Vuex | MobX | NgRx | GraphQLDeprecated | PerformanceTrack | StringDictDeprecated | SetNodeAttributeDictDeprecated | StringDict | SetNodeAttributeDict | ResourceTimingDeprecatedDeprecated | ConnectionInformation | SetPageVisibility | LoadFontFace | SetNodeFocus | LongTask | SetNodeAttributeURLBased | SetCSSDataURLBased | TechnicalInfo | CustomIssue | CSSInsertRuleURLBased | MouseClick | MouseClickDeprecated | CreateIFrameDocument | AdoptedSSReplaceURLBased | AdoptedSSInsertRuleURLBased | AdoptedSSDeleteRule | AdoptedSSAddOwner | AdoptedSSRemoveOwner | JSException | Zustand | BatchMetadata | PartitionedMessage | NetworkRequest | WSChannel | ResourceTiming | Incident | LongAnimationTask | InputChange | SelectionChange | MouseThrashing | UnbindNodes | ResourceTimingDeprecated | TabChange | TabData | CanvasNode | TagTrigger | Redux | SetPageLocation | GraphQL | WebVitals export default Message diff --git a/tracker/tracker/src/main/app/messages.gen.ts b/tracker/tracker/src/main/app/messages.gen.ts index 1421824ce..3d4aaace2 100644 --- a/tracker/tracker/src/main/app/messages.gen.ts +++ b/tracker/tracker/src/main/app/messages.gen.ts @@ -946,6 +946,19 @@ export function ResourceTiming( ] } +export function Incident( + label: string, + startTime: number, + endTime: number, +): Messages.Incident { + return [ + Messages.Type.Incident, + label, + startTime, + endTime, + ] +} + export function LongAnimationTask( name: string, duration: number, diff --git a/tracker/tracker/src/main/index.ts b/tracker/tracker/src/main/index.ts index d0df3edf3..fb7c3e72f 100644 --- a/tracker/tracker/src/main/index.ts +++ b/tracker/tracker/src/main/index.ts @@ -2,7 +2,7 @@ import App from './app/index.js' export { default as App } from './app/index.js' -import { UserAnonymousID, CustomEvent, CustomIssue } from './app/messages.gen.js' +import { UserAnonymousID, CustomEvent, CustomIssue, Incident } from './app/messages.gen.js' import * as _Messages from './app/messages.gen.js' export const Messages = _Messages @@ -539,4 +539,15 @@ export default class API { } } } + + incident = (options: { + label?: string; + startTime: number; + endTime?: number; + }) => { + if (this.app === null) { + return + } + this.app.send(Incident(options.label ?? '', options.startTime, options.endTime ?? options.startTime)) + } } diff --git a/tracker/tracker/src/webworker/MessageEncoder.gen.ts b/tracker/tracker/src/webworker/MessageEncoder.gen.ts index bb0bfc77e..4aa80734c 100644 --- a/tracker/tracker/src/webworker/MessageEncoder.gen.ts +++ b/tracker/tracker/src/webworker/MessageEncoder.gen.ts @@ -286,6 +286,10 @@ export default class MessageEncoder extends PrimitiveEncoder { return this.uint(msg[1]) && this.uint(msg[2]) && this.uint(msg[3]) && this.uint(msg[4]) && this.uint(msg[5]) && this.uint(msg[6]) && this.string(msg[7]) && this.string(msg[8]) && this.uint(msg[9]) && this.boolean(msg[10]) && this.uint(msg[11]) && this.uint(msg[12]) && this.uint(msg[13]) && this.uint(msg[14]) && this.uint(msg[15]) && this.uint(msg[16]) && this.uint(msg[17]) break + case Messages.Type.Incident: + return this.string(msg[1]) && this.int(msg[2]) && this.int(msg[3]) + break + case Messages.Type.LongAnimationTask: return this.string(msg[1]) && this.int(msg[2]) && this.int(msg[3]) && this.int(msg[4]) && this.int(msg[5]) && this.string(msg[6]) break From 256b049e7dccd6345e41260d38e720d4617cc2b7 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Wed, 28 May 2025 17:12:52 +0200 Subject: [PATCH 41/67] ui: embed player, some pdf fixes for kai --- .../app/components/Kai/components/ChatLog.tsx | 9 +++ .../app/components/Kai/components/ChatMsg.tsx | 35 +++++++-- .../components/Kai/components/EmbedPlayer.tsx | 75 +++++++++++++++++++ .../app/components/Session/ClipsPlayer.tsx | 5 +- .../Player/ClipPlayer/ClipPlayerContent.tsx | 5 +- .../Player/ClipPlayer/ClipPlayerControls.tsx | 4 +- .../Player/ClipPlayer/ClipPlayerHeader.tsx | 5 +- .../shared/SessionItem/PlayLink/PlayLink.tsx | 10 ++- .../shared/SessionItem/SessionItem.tsx | 56 +++++++++----- frontend/app/components/ui/Icons/index.ts | 5 ++ .../app/components/ui/Icons/play_fill_v2.tsx | 18 +++++ .../ui/Icons/play_fill_v2_assist.tsx | 18 +++++ frontend/app/components/ui/Icons/play_v2.tsx | 18 +++++ .../components/ui/Icons/play_v2_assist.tsx | 18 +++++ .../app/components/ui/Icons/played_v2.tsx | 18 +++++ frontend/app/components/ui/SVG.tsx | 22 +++++- frontend/app/layout/SideMenu.tsx | 65 ++++++++++++---- frontend/app/layout/data.ts | 12 ++- .../app/svg/icons/play-fill-v2-assist.svg | 6 ++ frontend/app/svg/icons/play-fill-v2.svg | 6 ++ frontend/app/svg/icons/play-v2-assist.svg | 6 ++ frontend/app/svg/icons/play-v2.svg | 6 ++ frontend/app/svg/icons/played-v2.svg | 6 ++ 23 files changed, 377 insertions(+), 51 deletions(-) create mode 100644 frontend/app/components/Kai/components/EmbedPlayer.tsx create mode 100644 frontend/app/components/ui/Icons/play_fill_v2.tsx create mode 100644 frontend/app/components/ui/Icons/play_fill_v2_assist.tsx create mode 100644 frontend/app/components/ui/Icons/play_v2.tsx create mode 100644 frontend/app/components/ui/Icons/play_v2_assist.tsx create mode 100644 frontend/app/components/ui/Icons/played_v2.tsx create mode 100644 frontend/app/svg/icons/play-fill-v2-assist.svg create mode 100644 frontend/app/svg/icons/play-fill-v2.svg create mode 100644 frontend/app/svg/icons/play-v2-assist.svg create mode 100644 frontend/app/svg/icons/play-v2.svg create mode 100644 frontend/app/svg/icons/played-v2.svg diff --git a/frontend/app/components/Kai/components/ChatLog.tsx b/frontend/app/components/Kai/components/ChatLog.tsx index e2b3d8a8d..76fccb584 100644 --- a/frontend/app/components/Kai/components/ChatLog.tsx +++ b/frontend/app/components/Kai/components/ChatLog.tsx @@ -5,6 +5,7 @@ import Ideas from './Ideas'; import { Loader } from 'UI'; import { kaiStore } from '../KaiStore'; import { observer } from 'mobx-react-lite'; +import EmbedPlayer from './EmbedPlayer'; function ChatLog({ projectId, @@ -21,6 +22,7 @@ function ChatLog({ chatTitle: string | null; onCancel: () => void; }) { + const [embedSession, setEmbedSession] = React.useState(null); const messages = kaiStore.messages; const loading = kaiStore.loadingChat; const chatRef = React.useRef(null); @@ -64,6 +66,12 @@ function ChatLog({ 'overflow-y-auto relative flex flex-col items-center justify-between w-full h-full pt-4' } > + {embedSession ? ( + setEmbedSession(null)} + /> + ) : null}
{messages.map((msg, index) => ( @@ -71,6 +79,7 @@ function ChatLog({ siteId={projectId} message={msg} chatTitle={chatTitle} + onReplay={(session) => setEmbedSession(session)} canEdit={ processingStage === null && msg.isUser && diff --git a/frontend/app/components/Kai/components/ChatMsg.tsx b/frontend/app/components/Kai/components/ChatMsg.tsx index 436d6ecb7..7a1d6d8dc 100644 --- a/frontend/app/components/Kai/components/ChatMsg.tsx +++ b/frontend/app/components/Kai/components/ChatMsg.tsx @@ -27,12 +27,14 @@ function ChatMsg({ canEdit, message, chatTitle, + onReplay, }: { message: Message; userName?: string; canEdit?: boolean; siteId: string; chatTitle: string | null; + onReplay: (session: any) => void; }) { const { t } = useTranslation(); const [metric, setMetric] = React.useState(null); @@ -73,7 +75,6 @@ function ChatMsg({ .then(async ({ jsPDF }) => { const doc = new jsPDF(); const blockWidth = 170; // mm - doc.addImage('/assets/img/logo-img.png', 20, 15, 30, 5); const content = bodyRef.current!.cloneNode(true) as HTMLElement; if (userPrompt) { const titleHeader = document.createElement('h2'); @@ -81,6 +82,18 @@ function ChatMsg({ titleHeader.style.marginBottom = '10px'; content.prepend(titleHeader); } + // insert logo /assets/img/logo-img.png + const logo = new Image(); + logo.src = '/assets/img/logo-img.png'; + logo.style.width = '130px'; + const container = document.createElement('div'); + container.style.display = 'flex'; + container.style.alignItems = 'center'; + container.style.justifyContent = 'center'; + container.style.marginBottom = '10mm'; + container.style.width = `${blockWidth}mm`; + container.appendChild(logo); + content.prepend(container); content.querySelectorAll('ul').forEach((ul) => { const frag = document.createDocumentFragment(); ul.querySelectorAll('li').forEach((li) => { @@ -123,9 +136,9 @@ function ChatMsg({ doc.save((chatTitle ?? 'document') + '.pdf'); }, // top, bottom, ?, left - margin: [5, 10, 20, 20], + margin: [10, 10, 20, 20], x: 0, - y: 15, + y: 0, // Target width width: blockWidth, // Window width for rendering @@ -172,7 +185,7 @@ function ChatMsg({ }, [metricData, chart_data]); return (
-
+
{message.sessions.map((session) => ( -
- +
+ { + e.preventDefault(); + e.stopPropagation(); + onReplay(session); + }} + slim + />
))}
diff --git a/frontend/app/components/Kai/components/EmbedPlayer.tsx b/frontend/app/components/Kai/components/EmbedPlayer.tsx new file mode 100644 index 000000000..6d4074f6d --- /dev/null +++ b/frontend/app/components/Kai/components/EmbedPlayer.tsx @@ -0,0 +1,75 @@ +import React from 'react'; +import cn from 'classnames'; +import { useStore } from 'App/mstore'; +import { Loader } from 'UI'; +import { observer } from 'mobx-react-lite'; +import MobileClipsPlayer from 'App/components/Session/MobileClipsPlayer'; +import ClipsPlayer from 'App/components/Session/ClipsPlayer'; +import Session from '@/types/session/session'; + +interface Clip { + sessionId: string | undefined; + range: [number, number]; + message: string; +} + +function EmbedPlayer({ + session, + onClose, +}: { + session: Session; + onClose: () => void; +}) { + const { projectsStore } = useStore(); + const clip = { + sessionId: session.sessionId, + range: [0, session.durationMs], + message: '', + }; + const { isMobile } = projectsStore; + + const onBgClick = (e: React.MouseEvent) => { + if (e.target === e.currentTarget) { + onClose(); + } + }; + return ( +
+
+ {isMobile ? ( + + ) : ( + + )} +
+
+ ); +} + +export default observer(EmbedPlayer); diff --git a/frontend/app/components/Session/ClipsPlayer.tsx b/frontend/app/components/Session/ClipsPlayer.tsx index e76ae46d5..82d3bcb0e 100644 --- a/frontend/app/components/Session/ClipsPlayer.tsx +++ b/frontend/app/components/Session/ClipsPlayer.tsx @@ -26,10 +26,11 @@ interface Props { autoplay: boolean; onClose?: () => void; isHighlight?: boolean; + isFull?: boolean; } function ClipsPlayer(props: Props) { - const { clip, currentIndex, isCurrent, onClose, isHighlight } = props; + const { clip, currentIndex, isCurrent, onClose, isHighlight, isFull } = props; const { sessionStore } = useStore(); const { prefetched } = sessionStore; const [windowActive, setWindowActive] = useState(!document.hidden); @@ -146,6 +147,7 @@ function ClipsPlayer(props: Props) { onClose={onClose} range={clip.range} session={session!} + isFull={isFull} /> ) : ( diff --git a/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerContent.tsx b/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerContent.tsx index ddf267669..cfaee07cf 100644 --- a/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerContent.tsx +++ b/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerContent.tsx @@ -19,13 +19,14 @@ interface Props { isHighlight?: boolean; message?: string; isMobile?: boolean; + isFull?: boolean; } function ClipPlayerContent(props: Props) { const playerContext = React.useContext(PlayerContext); const screenWrapper = React.useRef(null); const { time } = playerContext.store.get(); - const { range } = props; + const { range, isFull } = props; React.useEffect(() => { if (!playerContext.player) return; @@ -90,7 +91,7 @@ function ClipPlayerContent(props: Props) {
{props.message}
) : null} - +
); diff --git a/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerControls.tsx b/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerControls.tsx index 6d2dc0f82..19ca0e96e 100644 --- a/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerControls.tsx +++ b/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerControls.tsx @@ -15,9 +15,11 @@ import { useTranslation } from 'react-i18next'; function ClipPlayerControls({ session, range, + isFull, }: { session: Session; range: [number, number]; + isFull?: boolean; }) { const { t } = useTranslation(); const { projectsStore } = useStore(); @@ -47,7 +49,7 @@ function ClipPlayerControls({
diff --git a/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerHeader.tsx b/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerHeader.tsx index 75d8b6951..b7fd37c9e 100644 --- a/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerHeader.tsx +++ b/frontend/app/components/Session/Player/ClipPlayer/ClipPlayerHeader.tsx @@ -16,12 +16,13 @@ interface Props { range: [number, number]; onClose?: () => void; isHighlight?: boolean; + isFull?: boolean; } function ClipPlayerHeader(props: Props) { const { t } = useTranslation(); const { projectsStore } = useStore(); - const { session, range, onClose, isHighlight } = props; + const { session, range, onClose, isHighlight, isFull } = props; const { siteId } = projectsStore; const { message } = App.useApp(); @@ -33,7 +34,7 @@ function ClipPlayerHeader(props: Props) { }; return (
- {isHighlight ? : null} + {isHighlight && !isFull ? : null} diff --git a/frontend/app/components/shared/SessionItem/PlayLink/PlayLink.tsx b/frontend/app/components/shared/SessionItem/PlayLink/PlayLink.tsx index ce6b2f5c3..35a949510 100644 --- a/frontend/app/components/shared/SessionItem/PlayLink/PlayLink.tsx +++ b/frontend/app/components/shared/SessionItem/PlayLink/PlayLink.tsx @@ -10,7 +10,7 @@ import { Icon, Link } from 'UI'; import { useStore } from 'App/mstore'; const PLAY_ICON_NAMES = { - notPlayed: 'play-fill', + notPlayed: 'play-v2', played: 'play-circle-light', } as const; @@ -76,10 +76,14 @@ function PlayLink(props: Props) { rel={props.newTab ? 'noopener noreferrer' : undefined} >
- +
- +
); diff --git a/frontend/app/components/shared/SessionItem/SessionItem.tsx b/frontend/app/components/shared/SessionItem/SessionItem.tsx index 23128a84f..f4591e2b2 100644 --- a/frontend/app/components/shared/SessionItem/SessionItem.tsx +++ b/frontend/app/components/shared/SessionItem/SessionItem.tsx @@ -82,7 +82,8 @@ const PREFETCH_STATE = { function SessionItem(props: RouteComponentProps & Props) { const { location } = useHistory(); - const { settingsStore, sessionStore, searchStore, searchStoreLive } = useStore(); + const { settingsStore, sessionStore, searchStore, searchStoreLive } = + useStore(); const { timezone, shownTimezone } = settingsStore.sessionSettings; const { t } = useTranslation(); const [prefetchState, setPrefetched] = useState(PREFETCH_STATE.none); @@ -178,7 +179,7 @@ function SessionItem(props: RouteComponentProps & Props) { await sessionStore.getFirstMob(sessionId); setPrefetched(PREFETCH_STATE.fetched); } catch (e) { - setPrefetched(PREFETCH_STATE.none) + setPrefetched(PREFETCH_STATE.none); console.error('Error while prefetching first mob', e); } }, [prefetchState, live, isAssist, isMobile, sessionStore, sessionId]); @@ -247,13 +248,13 @@ function SessionItem(props: RouteComponentProps & Props) { ); }, [startedAt, timezone, userTimezone]); - const onMetaClick = (meta: { name: string, value: string }) => { + const onMetaClick = (meta: { name: string; value: string }) => { if (isAssist) { - searchStoreLive.addFilterByKeyAndValue(meta.name, meta.value) + searchStoreLive.addFilterByKeyAndValue(meta.name, meta.value); } else { searchStore.addFilterByKeyAndValue(meta.name, meta.value); } - } + }; return (
e.stopPropagation()} onMouseEnter={handleHover} @@ -293,13 +298,16 @@ function SessionItem(props: RouteComponentProps & Props) {
- {_metaList.length > 0 && ( - + {!slim && _metaList.length > 0 && ( + )}
)}
@@ -355,9 +368,12 @@ function SessionItem(props: RouteComponentProps & Props) {
-
+
)}
diff --git a/frontend/app/components/ui/Icons/index.ts b/frontend/app/components/ui/Icons/index.ts index 225deb1b0..976eeba73 100644 --- a/frontend/app/components/ui/Icons/index.ts +++ b/frontend/app/components/ui/Icons/index.ts @@ -416,9 +416,14 @@ export { default as Play_circle_bold } from './play_circle_bold'; export { default as Play_circle_light } from './play_circle_light'; export { default as Play_circle } from './play_circle'; export { default as Play_fill_new } from './play_fill_new'; +export { default as Play_fill_v2_assist } from './play_fill_v2_assist'; +export { default as Play_fill_v2 } from './play_fill_v2'; export { default as Play_fill } from './play_fill'; export { default as Play_hover } from './play_hover'; +export { default as Play_v2_assist } from './play_v2_assist'; +export { default as Play_v2 } from './play_v2'; export { default as Play } from './play'; +export { default as Played_v2 } from './played_v2'; export { default as Plug } from './plug'; export { default as Plus_circle } from './plus_circle'; export { default as Plus } from './plus'; diff --git a/frontend/app/components/ui/Icons/play_fill_v2.tsx b/frontend/app/components/ui/Icons/play_fill_v2.tsx new file mode 100644 index 000000000..abba72052 --- /dev/null +++ b/frontend/app/components/ui/Icons/play_fill_v2.tsx @@ -0,0 +1,18 @@ +/* Auto-generated, do not edit */ +import React from 'react'; + +interface Props { + size?: number | string; + width?: number | string; + height?: number | string; + fill?: string; +} + +function Play_fill_v2(props: Props) { + const { size = 14, width = size, height = size, fill = '' } = props; + return ( + + ); +} + +export default Play_fill_v2; diff --git a/frontend/app/components/ui/Icons/play_fill_v2_assist.tsx b/frontend/app/components/ui/Icons/play_fill_v2_assist.tsx new file mode 100644 index 000000000..1f28fb078 --- /dev/null +++ b/frontend/app/components/ui/Icons/play_fill_v2_assist.tsx @@ -0,0 +1,18 @@ +/* Auto-generated, do not edit */ +import React from 'react'; + +interface Props { + size?: number | string; + width?: number | string; + height?: number | string; + fill?: string; +} + +function Play_fill_v2_assist(props: Props) { + const { size = 14, width = size, height = size, fill = '' } = props; + return ( + + ); +} + +export default Play_fill_v2_assist; diff --git a/frontend/app/components/ui/Icons/play_v2.tsx b/frontend/app/components/ui/Icons/play_v2.tsx new file mode 100644 index 000000000..fea80e7e3 --- /dev/null +++ b/frontend/app/components/ui/Icons/play_v2.tsx @@ -0,0 +1,18 @@ +/* Auto-generated, do not edit */ +import React from 'react'; + +interface Props { + size?: number | string; + width?: number | string; + height?: number | string; + fill?: string; +} + +function Play_v2(props: Props) { + const { size = 14, width = size, height = size, fill = '' } = props; + return ( + + ); +} + +export default Play_v2; diff --git a/frontend/app/components/ui/Icons/play_v2_assist.tsx b/frontend/app/components/ui/Icons/play_v2_assist.tsx new file mode 100644 index 000000000..b22498527 --- /dev/null +++ b/frontend/app/components/ui/Icons/play_v2_assist.tsx @@ -0,0 +1,18 @@ +/* Auto-generated, do not edit */ +import React from 'react'; + +interface Props { + size?: number | string; + width?: number | string; + height?: number | string; + fill?: string; +} + +function Play_v2_assist(props: Props) { + const { size = 14, width = size, height = size, fill = '' } = props; + return ( + + ); +} + +export default Play_v2_assist; diff --git a/frontend/app/components/ui/Icons/played_v2.tsx b/frontend/app/components/ui/Icons/played_v2.tsx new file mode 100644 index 000000000..0f6e7fa6a --- /dev/null +++ b/frontend/app/components/ui/Icons/played_v2.tsx @@ -0,0 +1,18 @@ +/* Auto-generated, do not edit */ +import React from 'react'; + +interface Props { + size?: number | string; + width?: number | string; + height?: number | string; + fill?: string; +} + +function Played_v2(props: Props) { + const { size = 14, width = size, height = size, fill = '' } = props; + return ( + + ); +} + +export default Played_v2; diff --git a/frontend/app/components/ui/SVG.tsx b/frontend/app/components/ui/SVG.tsx index 4cec3d10f..76baa3999 100644 --- a/frontend/app/components/ui/SVG.tsx +++ b/frontend/app/components/ui/SVG.tsx @@ -418,9 +418,14 @@ import { Play_circle_light, Play_circle, Play_fill_new, + Play_fill_v2_assist, + Play_fill_v2, Play_fill, Play_hover, + Play_v2_assist, + Play_v2, Play, + Played_v2, Plug, Plus_circle, Plus, @@ -490,7 +495,7 @@ import { Zoom_in } from './Icons' -export type IconNames = 'activity' | 'analytics' | 'anchor' | 'arrow-bar-left' | 'arrow-clockwise' | 'arrow-counterclockwise' | 'arrow-down-short' | 'arrow-down-up' | 'arrow-down' | 'arrow-repeat' | 'arrow-right-short' | 'arrow-up-short' | 'arrow-up' | 'avatar/icn_avatar1' | 'avatar/icn_avatar10' | 'avatar/icn_avatar11' | 'avatar/icn_avatar12' | 'avatar/icn_avatar13' | 'avatar/icn_avatar14' | 'avatar/icn_avatar15' | 'avatar/icn_avatar16' | 'avatar/icn_avatar17' | 'avatar/icn_avatar18' | 'avatar/icn_avatar19' | 'avatar/icn_avatar2' | 'avatar/icn_avatar20' | 'avatar/icn_avatar21' | 'avatar/icn_avatar22' | 'avatar/icn_avatar23' | 'avatar/icn_avatar3' | 'avatar/icn_avatar4' | 'avatar/icn_avatar5' | 'avatar/icn_avatar6' | 'avatar/icn_avatar7' | 'avatar/icn_avatar8' | 'avatar/icn_avatar9' | 'ban' | 'bar-chart-line' | 'bar-pencil' | 'battery-charging' | 'battery' | 'bell-plus' | 'bell-slash' | 'bell' | 'binoculars' | 'book' | 'bookmark' | 'broadcast' | 'browser/browser' | 'browser/chrome' | 'browser/edge' | 'browser/electron' | 'browser/facebook' | 'browser/firefox' | 'browser/ie' | 'browser/opera' | 'browser/safari' | 'buildings' | 'bullhorn' | 'calendar' | 'call' | 'camera-video-off' | 'camera-video' | 'camera' | 'card-list' | 'card-text' | 'caret-down-fill' | 'caret-right-fill' | 'chat-dots' | 'chat-left-text' | 'chat-square-quote' | 'check-circle-fill' | 'check-circle' | 'check' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'circle-fill' | 'circle' | 'click-hesitation' | 'click-rage' | 'clipboard-check' | 'clock-history' | 'clock' | 'close' | 'code' | 'cog' | 'cogs' | 'collection-play' | 'collection' | 'color/apple' | 'color/browser/chrome' | 'color/browser/edge' | 'color/browser/facebook' | 'color/browser/firefox' | 'color/browser/google' | 'color/browser/opera' | 'color/browser/safari' | 'color/browser/unknown' | 'color/browser/whale' | 'color/chrome' | 'color/country/de' | 'color/country/fr' | 'color/country/gb' | 'color/country/in' | 'color/country/us' | 'color/de' | 'color/device/desktop' | 'color/device/mobile' | 'color/device/tablet' | 'color/device/unkown' | 'color/edge' | 'color/fedora' | 'color/firefox' | 'color/fr' | 'color/gb' | 'color/in' | 'color/issues/bad_request' | 'color/issues/click_rage' | 'color/issues/cpu' | 'color/issues/crash' | 'color/issues/custom' | 'color/issues/dead_click' | 'color/issues/errors' | 'color/issues/excessive_scrolling' | 'color/issues/js_exception' | 'color/issues/memory' | 'color/issues/missing_resource' | 'color/issues/mouse_thrashing' | 'color/issues/slow_page_load' | 'color/microsoft' | 'color/opera' | 'color/os/android' | 'color/os/apple' | 'color/os/elementary' | 'color/os/fedora' | 'color/os/ios' | 'color/os/linux' | 'color/os/macos' | 'color/os/microsoft' | 'color/os/ubuntu' | 'color/os/unkown' | 'color/safari' | 'color/ubuntu' | 'color/us' | 'columns-gap' | 'console/error' | 'console/exception' | 'console/info' | 'console/warning' | 'console' | 'controller' | 'cookies' | 'copy' | 'credit-card-2-back' | 'cross' | 'cubes' | 'cursor-trash' | 'cypress' | 'dash' | 'dashboard-icn' | 'dashboards/circle-alert' | 'dashboards/cohort-chart' | 'dashboards/heatmap-2' | 'dashboards/user-journey' | 'db-icons/icn-card-clickMap' | 'db-icons/icn-card-errors' | 'db-icons/icn-card-funnel' | 'db-icons/icn-card-funnels' | 'db-icons/icn-card-insights' | 'db-icons/icn-card-library' | 'db-icons/icn-card-mapchart' | 'db-icons/icn-card-pathAnalysis' | 'db-icons/icn-card-performance' | 'db-icons/icn-card-resources' | 'db-icons/icn-card-table' | 'db-icons/icn-card-timeseries' | 'db-icons/icn-card-webVitals' | 'desktop' | 'device' | 'diagram-3' | 'dizzy' | 'door-closed' | 'download' | 'drag' | 'edit' | 'ellipsis-v' | 'emoji-dizzy' | 'enter' | 'envelope-check' | 'envelope-paper' | 'envelope-x' | 'envelope' | 'errors-icon' | 'event/click' | 'event/click_hesitation' | 'event/clickrage' | 'event/code' | 'event/i-cursor' | 'event/input' | 'event/input_hesitation' | 'event/link' | 'event/location' | 'event/mouse_thrashing' | 'event/resize' | 'event/view' | 'exclamation-circle-fill' | 'exclamation-circle' | 'exclamation-triangle' | 'explosion' | 'export-pdf' | 'external-link-alt' | 'eye-slash-fill' | 'eye-slash' | 'eye' | 'fetch-request' | 'fetch' | 'fflag-multi' | 'fflag-single' | 'file-bar-graph' | 'file-code' | 'file-medical-alt' | 'file-pdf' | 'file' | 'files' | 'filetype-js' | 'filetype-pdf' | 'filter' | 'filters/arrow-return-right' | 'filters/browser' | 'filters/chevrons-up-down' | 'filters/click' | 'filters/clickrage' | 'filters/code' | 'filters/console' | 'filters/country' | 'filters/cpu-load' | 'filters/custom' | 'filters/device' | 'filters/dom-complete' | 'filters/duration' | 'filters/error' | 'filters/fetch-failed' | 'filters/fetch' | 'filters/file-code' | 'filters/graphql' | 'filters/i-cursor' | 'filters/input' | 'filters/lcpt' | 'filters/link' | 'filters/location' | 'filters/memory-load' | 'filters/metadata' | 'filters/os' | 'filters/perfromance-network-request' | 'filters/platform' | 'filters/referrer' | 'filters/resize' | 'filters/rev-id' | 'filters/screen' | 'filters/state-action' | 'filters/tag-element' | 'filters/ttfb' | 'filters/user-alt' | 'filters/userid' | 'filters/view' | 'flag-na' | 'folder-plus' | 'folder2' | 'fullscreen' | 'funnel/cpu-fill' | 'funnel/cpu' | 'funnel/dizzy' | 'funnel/emoji-angry-fill' | 'funnel/emoji-angry' | 'funnel/emoji-dizzy-fill' | 'funnel/exclamation-circle-fill' | 'funnel/exclamation-circle' | 'funnel/file-earmark-break-fill' | 'funnel/file-earmark-break' | 'funnel/file-earmark-minus-fill' | 'funnel/file-earmark-minus' | 'funnel/file-medical-alt' | 'funnel/file-x' | 'funnel/hdd-fill' | 'funnel/hourglass-top' | 'funnel/image-fill' | 'funnel/image' | 'funnel/microchip' | 'funnel/mouse' | 'funnel/patch-exclamation-fill' | 'funnel/sd-card' | 'funnel-fill' | 'funnel' | 'gear' | 'github' | 'graph-up' | 'grid-3x3' | 'grid-check' | 'grid' | 'hash' | 'headset' | 'history' | 'ic-errors' | 'ic-network' | 'ic-rage' | 'ic-resources' | 'icn_fetch-request' | 'icn_referrer' | 'icn_url' | 'id-card' | 'image' | 'info-circle-fill' | 'info-circle' | 'info-square' | 'info' | 'input-hesitation' | 'inspect' | 'integrations/assist' | 'integrations/bugsnag-text' | 'integrations/bugsnag' | 'integrations/cloudwatch-text' | 'integrations/cloudwatch' | 'integrations/datadog' | 'integrations/dynatrace' | 'integrations/elasticsearch-text' | 'integrations/elasticsearch' | 'integrations/github' | 'integrations/graphql' | 'integrations/jira-text' | 'integrations/jira' | 'integrations/mobx' | 'integrations/newrelic-text' | 'integrations/newrelic' | 'integrations/ngrx' | 'integrations/openreplay-text' | 'integrations/openreplay' | 'integrations/redux' | 'integrations/rollbar-text' | 'integrations/rollbar' | 'integrations/segment' | 'integrations/sentry-text' | 'integrations/sentry' | 'integrations/slack-bw' | 'integrations/slack' | 'integrations/stackdriver' | 'integrations/sumologic-text' | 'integrations/sumologic' | 'integrations/teams-white' | 'integrations/teams' | 'integrations/vuejs' | 'integrations/zustand' | 'journal-code' | 'kai-mono' | 'kai' | 'kai_colored' | 'key' | 'keyboard' | 'layers-half' | 'lightbulb-on' | 'lightbulb' | 'link-45deg' | 'list-alt' | 'list-ul' | 'list' | 'low-disc-space' | 'magic' | 'map-marker-alt' | 'memory-ios' | 'memory' | 'metadata-more' | 'mic-mute' | 'mic' | 'minus' | 'mobile' | 'mouse-alt' | 'mouse-pointer-click' | 'network' | 'next1' | 'no-dashboard' | 'no-metrics-chart' | 'no-metrics' | 'no-recordings' | 'orIcn' | 'orSpot' | 'orspotOutline' | 'os/android' | 'os/chrome_os' | 'os/fedora' | 'os/ios' | 'os/linux' | 'os/mac_os_x' | 'os/other' | 'os/ubuntu' | 'os/windows' | 'os' | 'pause-circle-fill' | 'pause-fill' | 'pause' | 'pdf-download' | 'pencil-stop' | 'pencil' | 'people' | 'percent' | 'performance-icon' | 'person-border' | 'person-fill' | 'person' | 'pie-chart-fill' | 'pin-fill' | 'play-circle-bold' | 'play-circle-light' | 'play-circle' | 'play-fill-new' | 'play-fill' | 'play-hover' | 'play' | 'plug' | 'plus-circle' | 'plus' | 'prev1' | 'pulse' | 'puppeteer' | 'puzzle-piece' | 'puzzle' | 'pwright' | 'question-circle' | 'question-lg' | 'quotes' | 'record-circle-fill' | 'record-circle' | 'record2' | 'redo' | 'redux' | 'referrer' | 'remote-control' | 'resources-icon' | 'safe' | 'sandglass' | 'search' | 'server' | 'share-alt' | 'shield-lock' | 'side_menu_closed' | 'side_menu_open' | 'signpost-split' | 'signup' | 'slack' | 'slash-circle' | 'sleep' | 'sliders' | 'social/slack' | 'social/trello' | 'sparkles' | 'speedometer2' | 'spinner' | 'square-mouse-pointer' | 'star' | 'step-forward' | 'stickies' | 'stop-record-circle' | 'stopwatch' | 'store' | 'sync-alt' | 'table' | 'tags' | 'terminal' | 'thermometer-sun' | 'toggles' | 'tools' | 'trash' | 'turtle' | 'user-alt' | 'user-circle' | 'user-friends' | 'user-journey' | 'user-switch' | 'users' | 'vendors/graphql' | 'web-vitals' | 'wifi' | 'window-x' | 'window' | 'zoom-in'; +export type IconNames = 'activity' | 'analytics' | 'anchor' | 'arrow-bar-left' | 'arrow-clockwise' | 'arrow-counterclockwise' | 'arrow-down-short' | 'arrow-down-up' | 'arrow-down' | 'arrow-repeat' | 'arrow-right-short' | 'arrow-up-short' | 'arrow-up' | 'avatar/icn_avatar1' | 'avatar/icn_avatar10' | 'avatar/icn_avatar11' | 'avatar/icn_avatar12' | 'avatar/icn_avatar13' | 'avatar/icn_avatar14' | 'avatar/icn_avatar15' | 'avatar/icn_avatar16' | 'avatar/icn_avatar17' | 'avatar/icn_avatar18' | 'avatar/icn_avatar19' | 'avatar/icn_avatar2' | 'avatar/icn_avatar20' | 'avatar/icn_avatar21' | 'avatar/icn_avatar22' | 'avatar/icn_avatar23' | 'avatar/icn_avatar3' | 'avatar/icn_avatar4' | 'avatar/icn_avatar5' | 'avatar/icn_avatar6' | 'avatar/icn_avatar7' | 'avatar/icn_avatar8' | 'avatar/icn_avatar9' | 'ban' | 'bar-chart-line' | 'bar-pencil' | 'battery-charging' | 'battery' | 'bell-plus' | 'bell-slash' | 'bell' | 'binoculars' | 'book' | 'bookmark' | 'broadcast' | 'browser/browser' | 'browser/chrome' | 'browser/edge' | 'browser/electron' | 'browser/facebook' | 'browser/firefox' | 'browser/ie' | 'browser/opera' | 'browser/safari' | 'buildings' | 'bullhorn' | 'calendar' | 'call' | 'camera-video-off' | 'camera-video' | 'camera' | 'card-list' | 'card-text' | 'caret-down-fill' | 'caret-right-fill' | 'chat-dots' | 'chat-left-text' | 'chat-square-quote' | 'check-circle-fill' | 'check-circle' | 'check' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'circle-fill' | 'circle' | 'click-hesitation' | 'click-rage' | 'clipboard-check' | 'clock-history' | 'clock' | 'close' | 'code' | 'cog' | 'cogs' | 'collection-play' | 'collection' | 'color/apple' | 'color/browser/chrome' | 'color/browser/edge' | 'color/browser/facebook' | 'color/browser/firefox' | 'color/browser/google' | 'color/browser/opera' | 'color/browser/safari' | 'color/browser/unknown' | 'color/browser/whale' | 'color/chrome' | 'color/country/de' | 'color/country/fr' | 'color/country/gb' | 'color/country/in' | 'color/country/us' | 'color/de' | 'color/device/desktop' | 'color/device/mobile' | 'color/device/tablet' | 'color/device/unkown' | 'color/edge' | 'color/fedora' | 'color/firefox' | 'color/fr' | 'color/gb' | 'color/in' | 'color/issues/bad_request' | 'color/issues/click_rage' | 'color/issues/cpu' | 'color/issues/crash' | 'color/issues/custom' | 'color/issues/dead_click' | 'color/issues/errors' | 'color/issues/excessive_scrolling' | 'color/issues/js_exception' | 'color/issues/memory' | 'color/issues/missing_resource' | 'color/issues/mouse_thrashing' | 'color/issues/slow_page_load' | 'color/microsoft' | 'color/opera' | 'color/os/android' | 'color/os/apple' | 'color/os/elementary' | 'color/os/fedora' | 'color/os/ios' | 'color/os/linux' | 'color/os/macos' | 'color/os/microsoft' | 'color/os/ubuntu' | 'color/os/unkown' | 'color/safari' | 'color/ubuntu' | 'color/us' | 'columns-gap' | 'console/error' | 'console/exception' | 'console/info' | 'console/warning' | 'console' | 'controller' | 'cookies' | 'copy' | 'credit-card-2-back' | 'cross' | 'cubes' | 'cursor-trash' | 'cypress' | 'dash' | 'dashboard-icn' | 'dashboards/circle-alert' | 'dashboards/cohort-chart' | 'dashboards/heatmap-2' | 'dashboards/user-journey' | 'db-icons/icn-card-clickMap' | 'db-icons/icn-card-errors' | 'db-icons/icn-card-funnel' | 'db-icons/icn-card-funnels' | 'db-icons/icn-card-insights' | 'db-icons/icn-card-library' | 'db-icons/icn-card-mapchart' | 'db-icons/icn-card-pathAnalysis' | 'db-icons/icn-card-performance' | 'db-icons/icn-card-resources' | 'db-icons/icn-card-table' | 'db-icons/icn-card-timeseries' | 'db-icons/icn-card-webVitals' | 'desktop' | 'device' | 'diagram-3' | 'dizzy' | 'door-closed' | 'download' | 'drag' | 'edit' | 'ellipsis-v' | 'emoji-dizzy' | 'enter' | 'envelope-check' | 'envelope-paper' | 'envelope-x' | 'envelope' | 'errors-icon' | 'event/click' | 'event/click_hesitation' | 'event/clickrage' | 'event/code' | 'event/i-cursor' | 'event/input' | 'event/input_hesitation' | 'event/link' | 'event/location' | 'event/mouse_thrashing' | 'event/resize' | 'event/view' | 'exclamation-circle-fill' | 'exclamation-circle' | 'exclamation-triangle' | 'explosion' | 'export-pdf' | 'external-link-alt' | 'eye-slash-fill' | 'eye-slash' | 'eye' | 'fetch-request' | 'fetch' | 'fflag-multi' | 'fflag-single' | 'file-bar-graph' | 'file-code' | 'file-medical-alt' | 'file-pdf' | 'file' | 'files' | 'filetype-js' | 'filetype-pdf' | 'filter' | 'filters/arrow-return-right' | 'filters/browser' | 'filters/chevrons-up-down' | 'filters/click' | 'filters/clickrage' | 'filters/code' | 'filters/console' | 'filters/country' | 'filters/cpu-load' | 'filters/custom' | 'filters/device' | 'filters/dom-complete' | 'filters/duration' | 'filters/error' | 'filters/fetch-failed' | 'filters/fetch' | 'filters/file-code' | 'filters/graphql' | 'filters/i-cursor' | 'filters/input' | 'filters/lcpt' | 'filters/link' | 'filters/location' | 'filters/memory-load' | 'filters/metadata' | 'filters/os' | 'filters/perfromance-network-request' | 'filters/platform' | 'filters/referrer' | 'filters/resize' | 'filters/rev-id' | 'filters/screen' | 'filters/state-action' | 'filters/tag-element' | 'filters/ttfb' | 'filters/user-alt' | 'filters/userid' | 'filters/view' | 'flag-na' | 'folder-plus' | 'folder2' | 'fullscreen' | 'funnel/cpu-fill' | 'funnel/cpu' | 'funnel/dizzy' | 'funnel/emoji-angry-fill' | 'funnel/emoji-angry' | 'funnel/emoji-dizzy-fill' | 'funnel/exclamation-circle-fill' | 'funnel/exclamation-circle' | 'funnel/file-earmark-break-fill' | 'funnel/file-earmark-break' | 'funnel/file-earmark-minus-fill' | 'funnel/file-earmark-minus' | 'funnel/file-medical-alt' | 'funnel/file-x' | 'funnel/hdd-fill' | 'funnel/hourglass-top' | 'funnel/image-fill' | 'funnel/image' | 'funnel/microchip' | 'funnel/mouse' | 'funnel/patch-exclamation-fill' | 'funnel/sd-card' | 'funnel-fill' | 'funnel' | 'gear' | 'github' | 'graph-up' | 'grid-3x3' | 'grid-check' | 'grid' | 'hash' | 'headset' | 'history' | 'ic-errors' | 'ic-network' | 'ic-rage' | 'ic-resources' | 'icn_fetch-request' | 'icn_referrer' | 'icn_url' | 'id-card' | 'image' | 'info-circle-fill' | 'info-circle' | 'info-square' | 'info' | 'input-hesitation' | 'inspect' | 'integrations/assist' | 'integrations/bugsnag-text' | 'integrations/bugsnag' | 'integrations/cloudwatch-text' | 'integrations/cloudwatch' | 'integrations/datadog' | 'integrations/dynatrace' | 'integrations/elasticsearch-text' | 'integrations/elasticsearch' | 'integrations/github' | 'integrations/graphql' | 'integrations/jira-text' | 'integrations/jira' | 'integrations/mobx' | 'integrations/newrelic-text' | 'integrations/newrelic' | 'integrations/ngrx' | 'integrations/openreplay-text' | 'integrations/openreplay' | 'integrations/redux' | 'integrations/rollbar-text' | 'integrations/rollbar' | 'integrations/segment' | 'integrations/sentry-text' | 'integrations/sentry' | 'integrations/slack-bw' | 'integrations/slack' | 'integrations/stackdriver' | 'integrations/sumologic-text' | 'integrations/sumologic' | 'integrations/teams-white' | 'integrations/teams' | 'integrations/vuejs' | 'integrations/zustand' | 'journal-code' | 'kai-mono' | 'kai' | 'kai_colored' | 'key' | 'keyboard' | 'layers-half' | 'lightbulb-on' | 'lightbulb' | 'link-45deg' | 'list-alt' | 'list-ul' | 'list' | 'low-disc-space' | 'magic' | 'map-marker-alt' | 'memory-ios' | 'memory' | 'metadata-more' | 'mic-mute' | 'mic' | 'minus' | 'mobile' | 'mouse-alt' | 'mouse-pointer-click' | 'network' | 'next1' | 'no-dashboard' | 'no-metrics-chart' | 'no-metrics' | 'no-recordings' | 'orIcn' | 'orSpot' | 'orspotOutline' | 'os/android' | 'os/chrome_os' | 'os/fedora' | 'os/ios' | 'os/linux' | 'os/mac_os_x' | 'os/other' | 'os/ubuntu' | 'os/windows' | 'os' | 'pause-circle-fill' | 'pause-fill' | 'pause' | 'pdf-download' | 'pencil-stop' | 'pencil' | 'people' | 'percent' | 'performance-icon' | 'person-border' | 'person-fill' | 'person' | 'pie-chart-fill' | 'pin-fill' | 'play-circle-bold' | 'play-circle-light' | 'play-circle' | 'play-fill-new' | 'play-fill-v2-assist' | 'play-fill-v2' | 'play-fill' | 'play-hover' | 'play-v2-assist' | 'play-v2' | 'play' | 'played-v2' | 'plug' | 'plus-circle' | 'plus' | 'prev1' | 'pulse' | 'puppeteer' | 'puzzle-piece' | 'puzzle' | 'pwright' | 'question-circle' | 'question-lg' | 'quotes' | 'record-circle-fill' | 'record-circle' | 'record2' | 'redo' | 'redux' | 'referrer' | 'remote-control' | 'resources-icon' | 'safe' | 'sandglass' | 'search' | 'server' | 'share-alt' | 'shield-lock' | 'side_menu_closed' | 'side_menu_open' | 'signpost-split' | 'signup' | 'slack' | 'slash-circle' | 'sleep' | 'sliders' | 'social/slack' | 'social/trello' | 'sparkles' | 'speedometer2' | 'spinner' | 'square-mouse-pointer' | 'star' | 'step-forward' | 'stickies' | 'stop-record-circle' | 'stopwatch' | 'store' | 'sync-alt' | 'table' | 'tags' | 'terminal' | 'thermometer-sun' | 'toggles' | 'tools' | 'trash' | 'turtle' | 'user-alt' | 'user-circle' | 'user-friends' | 'user-journey' | 'user-switch' | 'users' | 'vendors/graphql' | 'web-vitals' | 'wifi' | 'window-x' | 'window' | 'zoom-in'; interface Props { name: IconNames; @@ -1753,15 +1758,30 @@ const SVG = (props: Props) => { // case 'play-fill-new': case 'play-fill-new': return ; + // case 'play-fill-v2-assist': + case 'play-fill-v2-assist': return ; + + // case 'play-fill-v2': + case 'play-fill-v2': return ; + // case 'play-fill': case 'play-fill': return ; // case 'play-hover': case 'play-hover': return ; + // case 'play-v2-assist': + case 'play-v2-assist': return ; + + // case 'play-v2': + case 'play-v2': return ; + case 'play': return ; + // case 'played-v2': + case 'played-v2': return ; + case 'plug': return ; diff --git a/frontend/app/layout/SideMenu.tsx b/frontend/app/layout/SideMenu.tsx index bf4803160..5b2de2054 100644 --- a/frontend/app/layout/SideMenu.tsx +++ b/frontend/app/layout/SideMenu.tsx @@ -29,6 +29,7 @@ import { spotOnlyCats, } from './data'; import { useTranslation } from 'react-i18next'; +import { tag } from '@/components/Session_/Inspector/inspector.css'; const { Text } = Typography; @@ -104,7 +105,7 @@ function SideMenu(props: Props) { modules.includes(MODULES.USABILITY_TESTS), item.isAdmin && !isAdmin, item.isEnterprise && !isEnterprise, - item.key === MENU.KAI && !hasAi + item.key === MENU.KAI && !hasAi, ].some((cond) => cond); return { ...item, hidden: isHidden }; @@ -118,7 +119,15 @@ function SideMenu(props: Props) { hidden: allItemsHidden, }; }); - }, [isAdmin, isEnterprise, isPreferencesActive, modules, spotOnly, siteId, i18n.language]); + }, [ + isAdmin, + isEnterprise, + isPreferencesActive, + modules, + spotOnly, + siteId, + i18n.language, + ]); const menuRoutes: any = { [MENU.EXIT]: () => @@ -216,7 +225,10 @@ function SideMenu(props: Props) { color={isActive ? 'teal' : 'black'} /> } - className={cn('!rounded-lg hover-fill-teal', isActive ? 'color-main' : 'color-black')} + className={cn( + '!rounded-lg hover-fill-teal', + isActive ? 'color-main' : 'color-black', + )} > {item.label} @@ -235,7 +247,10 @@ function SideMenu(props: Props) { /> } style={{ paddingLeft: '20px' }} - className={cn('!rounded-lg !pe-0', isActive ? 'color-main' : 'color-black')} + className={cn( + '!rounded-lg !pe-0', + isActive ? 'color-main' : 'color-black', + )} itemIcon={ item.leading ? ( {item.label} - - {t('Beta')} -
); @@ -285,7 +293,20 @@ function SideMenu(props: Props) { })} key={child.key} > - {child.label} +
+ {child.label} + {child.tag ? ( +
+ + {child.tag.label} + +
+ ) : null} +
))} @@ -301,7 +322,10 @@ function SideMenu(props: Props) { /> } style={{ paddingLeft: '20px' }} - className={cn('!rounded-lg hover-fill-teal', isActive ? 'color-main' : 'color-black')} + className={cn( + '!rounded-lg hover-fill-teal', + isActive ? 'color-main' : 'color-black', + )} itemIcon={ item.leading ? ( - {item.label} +
+ {item.label} + {item.tag ? ( +
+ + {item.tag.label} + +
+ ) : null} +
); })} diff --git a/frontend/app/layout/data.ts b/frontend/app/layout/data.ts index 96b998d90..30a7d785d 100644 --- a/frontend/app/layout/data.ts +++ b/frontend/app/layout/data.ts @@ -1,5 +1,5 @@ import { TFunction } from 'i18next'; -import { IconNames } from "../components/ui/SVG"; +import { IconNames } from '../components/ui/SVG'; import React from 'react'; export interface MenuItem { @@ -99,7 +99,15 @@ export const categories: (t: TFunction) => Category[] = (t) => [ title: '', key: 'kai', items: [ - { label: t('Kai'), key: MENU.KAI, icon: 'kai' }, + { + label: t('Kai'), + key: MENU.KAI, + icon: 'kai-mono', + tag: { + label: t('New'), + color: '#394DFE', + }, + }, ], }, { diff --git a/frontend/app/svg/icons/play-fill-v2-assist.svg b/frontend/app/svg/icons/play-fill-v2-assist.svg new file mode 100644 index 000000000..79ff10a89 --- /dev/null +++ b/frontend/app/svg/icons/play-fill-v2-assist.svg @@ -0,0 +1,6 @@ + + + + diff --git a/frontend/app/svg/icons/play-fill-v2.svg b/frontend/app/svg/icons/play-fill-v2.svg new file mode 100644 index 000000000..1c2c732ce --- /dev/null +++ b/frontend/app/svg/icons/play-fill-v2.svg @@ -0,0 +1,6 @@ + + + + diff --git a/frontend/app/svg/icons/play-v2-assist.svg b/frontend/app/svg/icons/play-v2-assist.svg new file mode 100644 index 000000000..a885bffe9 --- /dev/null +++ b/frontend/app/svg/icons/play-v2-assist.svg @@ -0,0 +1,6 @@ + + + + diff --git a/frontend/app/svg/icons/play-v2.svg b/frontend/app/svg/icons/play-v2.svg new file mode 100644 index 000000000..a9aa5f578 --- /dev/null +++ b/frontend/app/svg/icons/play-v2.svg @@ -0,0 +1,6 @@ + + + + diff --git a/frontend/app/svg/icons/played-v2.svg b/frontend/app/svg/icons/played-v2.svg new file mode 100644 index 000000000..58d7a97aa --- /dev/null +++ b/frontend/app/svg/icons/played-v2.svg @@ -0,0 +1,6 @@ + + + + From 974bbf7e4fb2e1c9b4fa883ce1bffae4e3f39f4b Mon Sep 17 00:00:00 2001 From: Andrey Babushkin <55714097+reyand43@users.noreply.github.com> Date: Wed, 28 May 2025 17:36:26 +0200 Subject: [PATCH 42/67] fix empty incidents (#3448) --- frontend/app/components/Session_/Player/Controls/EventsList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/components/Session_/Player/Controls/EventsList.tsx b/frontend/app/components/Session_/Player/Controls/EventsList.tsx index 732613f48..cdaf92d77 100644 --- a/frontend/app/components/Session_/Player/Controls/EventsList.tsx +++ b/frontend/app/components/Session_/Player/Controls/EventsList.tsx @@ -45,7 +45,7 @@ function EventsList() { style={{ left: `${getTimelinePosition(e.time, scale)}%` }} /> ))} - {incidents.map((i) => { + {incidents?.map((i) => { const width = getTimelineEventWidth(endTime, (i as any).time, (i as any).endTime - sessionStart); return ( From 64cd7192ad74e1848217674f718dd375e75c2e9c Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Wed, 28 May 2025 17:45:00 +0200 Subject: [PATCH 43/67] ui: rm default filter for mob --- .../shared/SessionFilters/SessionFilters.tsx | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/frontend/app/components/shared/SessionFilters/SessionFilters.tsx b/frontend/app/components/shared/SessionFilters/SessionFilters.tsx index a4f060426..80ff27bca 100644 --- a/frontend/app/components/shared/SessionFilters/SessionFilters.tsx +++ b/frontend/app/components/shared/SessionFilters/SessionFilters.tsx @@ -35,14 +35,11 @@ function SessionFilters() { useEffect(() => { // Add default location/screen filter if no filters are present - if (searchStore.instance.filters.length === 0) { - searchStore.addFilterByKeyAndValue( - activeProject?.platform === 'web' - ? FilterKey.LOCATION - : FilterKey.VIEW_MOBILE, - '', - 'isAny', - ); + if ( + searchStore.instance.filters.length === 0 && + activeProject?.platform === 'web' + ) { + searchStore.addFilterByKeyAndValue(FilterKey.LOCATION, '', 'isAny'); } void reloadTags(); }, [projectsStore.activeSiteId, activeProject]); @@ -65,7 +62,7 @@ function SessionFilters() { }; const onFilterMove = (newFilters: any) => { - searchStore.updateSearch({ ...appliedFilter, filters: newFilters}); + searchStore.updateSearch({ ...appliedFilter, filters: newFilters }); // debounceFetch(); }; From 75230d72ec7ba6cc17b5497d07a43185c38f87e5 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Wed, 28 May 2025 19:33:18 +0200 Subject: [PATCH 44/67] fix(ui): new card data state is not updating --- .../components/Dashboard/components/WidgetView/WidgetView.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx b/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx index b7d03d83e..8ef38d6b1 100644 --- a/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx +++ b/frontend/app/components/Dashboard/components/WidgetView/WidgetView.tsx @@ -72,7 +72,6 @@ function WidgetView({ const params = new URLSearchParams(location.search); const mk = params.get('mk'); if (mk) { - metricStore.init(); const selectedCard = CARD_LIST(t).find((c) => c.key === mk) as CardType; if (selectedCard) { const cardData: any = { From 0d9c8d70c8d23a8aa58a9555197dec7565ee80e6 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 30 May 2025 10:34:04 +0200 Subject: [PATCH 45/67] ui: fixed card and tag removal, alert buttons, kai input disable state --- .../components/Client/Projects/TagForm.tsx | 22 ++--- .../Alerts/AlertForm/BottomButtons.tsx | 1 + .../components/Alerts/AlertForm/Condition.tsx | 1 + .../components/MetricsList/ListView.tsx | 80 ++++++++++--------- .../components/MetricsList/MetricsList.tsx | 23 +++--- .../components/WidgetView/CardViewMenu.tsx | 45 +++++------ .../components/Kai/components/ChatInput.tsx | 6 +- 7 files changed, 96 insertions(+), 82 deletions(-) diff --git a/frontend/app/components/Client/Projects/TagForm.tsx b/frontend/app/components/Client/Projects/TagForm.tsx index 1026b71e1..f0193066f 100644 --- a/frontend/app/components/Client/Projects/TagForm.tsx +++ b/frontend/app/components/Client/Projects/TagForm.tsx @@ -1,10 +1,10 @@ import React from 'react'; -import { Button, Form, Input, Space, Modal } from 'antd'; +import { Button, Form, Input, Space } from 'antd'; import { Trash } from 'UI/Icons'; import { useStore } from '@/mstore'; import { useModal } from 'Components/ModalContext'; import { useTranslation } from 'react-i18next'; - +import { confirm } from 'UI'; interface Props { tag: any; projectId: number; @@ -23,14 +23,16 @@ function TagForm(props: Props) { }; const onDelete = async () => { - Modal.confirm({ - title: t('Tag'), - content: t('Are you sure you want to remove?'), - onOk: async () => { - await tagWatchStore.deleteTag(tag.tagId, projectId); - closeModal(); - }, - }); + if ( + await confirm({ + header: t('Remove Tag'), + confirmButton: t('Remove'), + confirmation: t('Are you sure you want to remove this tag?'), + }) + ) { + await tagWatchStore.deleteTag(tag.tagId, projectId); + closeModal(); + } }; const onSave = async () => { diff --git a/frontend/app/components/Dashboard/components/Alerts/AlertForm/BottomButtons.tsx b/frontend/app/components/Dashboard/components/Alerts/AlertForm/BottomButtons.tsx index 1acc57fd8..90751e4e4 100644 --- a/frontend/app/components/Dashboard/components/Alerts/AlertForm/BottomButtons.tsx +++ b/frontend/app/components/Dashboard/components/Alerts/AlertForm/BottomButtons.tsx @@ -23,6 +23,7 @@ function BottomButtons({