diff --git a/.github/assets/viewer_event_list.png b/.github/assets/viewer_event_list.png new file mode 100644 index 0000000..219698c Binary files /dev/null and b/.github/assets/viewer_event_list.png differ diff --git a/.github/assets/viewer_graph.png b/.github/assets/viewer_graph.png new file mode 100644 index 0000000..51ae241 Binary files /dev/null and b/.github/assets/viewer_graph.png differ diff --git a/.gitignore b/.gitignore index 898d702..712a675 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ dist/ coverage/ node_modules/ +# TypeScript build cache +*.tsbuildinfo + # pnpm files .pnpm-store/ .pnpm-debug.log @@ -16,4 +19,7 @@ node_modules/ logs/ *.log +# Vite auto-generated declaration file +vite.config.d.ts + docs/ \ No newline at end of file diff --git a/README.md b/README.md index 776a58e..befebac 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,26 @@ # @accordkit/viewer -[![Part of AccordKit](https://img.shields.io/badge/AccordKit-ecosystem-00cc88?style=flat-square)](https://github.com/accordkit) - -> **Part of the [AccordKit](https://github.com/accordkit) ecosystem** -> an open, AI-agnostic tracing SDK for LLM-powered and ChatGPT-interoperable applications. -> AccordKit gives developers local-first observability: **no vendor lock-in, no opaque dashboards**, just clean event streams and tools that work anywhere. - The AccordKit Viewer is a lightweight, pluggable trace viewer for AI tool and model observability. It visualizes traces, spans, messages, and tool calls in real time, with plugin slots for custom visualizations and metrics. --- +## Orchestrator Graph View + +Automatically render your entire trace as an interactive Directed Acyclic Graph (DAG) to understand the real flow of your agent. + +
+ AccordKit Viewer orchestrator graph screenshot +
+ +## Hierarchical List View + +A classic, indented list that's 10x clearer than a flat log, complete with latency bars, plugin support, and deep inspection. + +
+ AccordKit Viewer list view screenshot +
+ ## Getting Started ### 1. Install dependencies @@ -27,11 +37,19 @@ pnpm dev Then open http://localhost:5173 -### 3. Load sample traces +### 3. Run the full app (with mock server) + +To see live streaming in action, run this command to start the Vite server and the mock SSE server. + +```bash +pnpm dev:all +``` + +### 4. Load sample traces Inside the app, click “Load sample trace” — or provide your own .json trace exported from the AccordKit tracer SDK. -### 4. Extend with your own plugin +### 5. Extend with your own plugin ```tsx import { PluginProvider } from "./plugins"; @@ -51,14 +69,15 @@ export function Main() { ## ✨ Features +- ⚡ Blazing Fast & 100% Local: Drag-and-drop a trace file and start exploring. No login, no backend. +- 🧠 Orchestrator Graph View: Automatically renders your trace as an interactive xyflow DAG to understand agent flow. +- 🔬 Hierarchical List View: A classic, indented list that correctly visualizes parent-child relationships, tool calls, and latencies. - 🪶 Trace and event visualization — Inspect spans, messages, tool calls, and results -- 🌲 Nested span tree — Hierarchical span rendering with indentation and sorting -- 🧩 Plugin slots — Extend the viewer with your own UI blocks (TopBanner, RightPanel, EventExtras) +- 🔴 Live Streaming (SSE/WS): Connect to a live event stream (like the included mock server) and watch traces build in real-time. +- 🧩 Extensible Plugin System: Add custom components to the UI using React slots (TopBanner, RightPanel, EventExtras). - ⚡ Latency and usage plugins — Example: LatencyBarPlugin shows timing and token usage - 🔍 Advanced filters — Filter by type, provider, model, log level, or full-text search - 🧠 Typed utils — Fully typed build functions (buildSpanForest, eventFilters), zero any -- 🧪 Full test coverage — Vitest + React Testing Library for new components and utilities -- 🔄 (coming soon) Live tail mode — Stream traces in real time via SSE/WebSocket --- @@ -103,13 +122,14 @@ export function LatencyBarPlugin({ event }: { event: TracerEvent }) { ## Scripts -| Command | Description | -| ------------- | ------------------------------------ | -| `pnpm dev` | Start the Vite dev server with HMR. | -| `pnpm build` | Type-check and build for production. | -| `pnpm test` | Run Vitest unit/integration tests. | -| `pnpm lint` | Run ESLint (TypeScript + React). | -| `pnpm format` | Format sources with Prettier. | +| Command | Description | +| -------------- | ------------------------------------ | +| `pnpm dev` | Start the Vite dev server with HMR. | +| `pnpm dev:all` | Start React and Node dev servers. | +| `pnpm build` | Type-check and build for production. | +| `pnpm test` | Run Vitest unit/integration tests. | +| `pnpm lint` | Run ESLint (TypeScript + React). | +| `pnpm format` | Format sources with Prettier. | --- @@ -149,4 +169,4 @@ MIT © AccordKit Contributors ## 🤝 Contributing -Issues and PRs welcome! +Issues and PRs welcome! diff --git a/package.json b/package.json index 3ce1e3e..dfe2704 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,9 @@ "typecheck": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@accordkit/tracer": "^0.2.0", + "@accordkit/tracer": "0.2.1", + "@xyflow/react": "^12.9.2", + "dagre": "^0.8.5", "react": "^18.3.1", "react-dom": "^18.3.1" }, @@ -48,6 +50,7 @@ "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", + "@types/dagre": "^0.7.53", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@typescript-eslint/eslint-plugin": "^8.46.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index af770b7..263e9a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,14 @@ importers: .: dependencies: '@accordkit/tracer': - specifier: ^0.2.0 - version: 0.2.0 + specifier: 0.2.1 + version: 0.2.1 + '@xyflow/react': + specifier: ^12.9.2 + version: 12.9.2(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + dagre: + specifier: ^0.8.5 + version: 0.8.5 react: specifier: ^18.3.1 version: 18.3.1 @@ -33,6 +39,9 @@ importers: '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.1) + '@types/dagre': + specifier: ^0.7.53 + version: 0.7.53 '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -96,8 +105,8 @@ importers: packages: - '@accordkit/tracer@0.2.0': - resolution: {integrity: sha512-mjBV78mAjzvcWOOnNdbIzg1HrEa7Xf8oitKjV86IcPhMnoJuGnY6MA1ir6+CObMYSU24KIx9T7YhQIyJwnKkEw==} + '@accordkit/tracer@0.2.1': + resolution: {integrity: sha512-u1XAn3pF4e60bQpTzssigIsmqsCwFz9pApyRtW9mGtbNtnq1aq5PdExsZeA+0QVXwyyEBAFOMNh6ks5nqdA+GA==} '@acemir/cssom@0.9.19': resolution: {integrity: sha512-Pp2gAQXPZ2o7lt4j0IMwNRXqQ3pagxtDj5wctL5U2Lz4oV0ocDNlkgx4DpxfyKav4S/bePuI+SMqcBSUHLy9kg==} @@ -636,6 +645,27 @@ packages: '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/dagre@0.7.53': + resolution: {integrity: sha512-f4gkWqzPZvYmKhOsDnhq/R8mO4UMcKdxZo+i5SCkOU1wvGeHJeUXGIHeE9pnwGyPMDof1Vx5ZQo4nxpeg2TTVQ==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -772,6 +802,15 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@xyflow/react@12.9.2': + resolution: {integrity: sha512-Xr+LFcysHCCoc5KRHaw+FwbqbWYxp9tWtk1mshNcqy25OAPuaKzXSdqIMNOA82TIXF/gFKo0Wgpa6PU7wUUVqw==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + + '@xyflow/system@0.0.72': + resolution: {integrity: sha512-WBI5Aau0fXTXwxHPzceLNS6QdXggSWnGjDtj/gG669crApN8+SCmEtkBth1m7r6pStNo/5fI9McEi7Dk0ymCLA==} + accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -938,6 +977,9 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} + classcat@5.0.5: + resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -995,6 +1037,47 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + dagre@0.8.5: + resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} + data-urls@6.0.0: resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} engines: {node: '>=20'} @@ -1390,6 +1473,9 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphlib@2.1.8: + resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -1683,6 +1769,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2323,6 +2412,11 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -2485,9 +2579,24 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zustand@4.5.7: + resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + snapshots: - '@accordkit/tracer@0.2.0': {} + '@accordkit/tracer@0.2.1': {} '@acemir/cssom@0.9.19': {} @@ -2957,6 +3066,29 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + '@types/d3-color@3.1.3': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/dagre@0.7.53': {} + '@types/deep-eql@4.0.2': {} '@types/estree@1.0.8': {} @@ -3150,6 +3282,29 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 + '@xyflow/react@12.9.2(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@xyflow/system': 0.0.72 + classcat: 5.0.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + zustand: 4.5.7(@types/react@19.2.2)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - immer + + '@xyflow/system@0.0.72': + dependencies: + '@types/d3-drag': 3.0.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + accepts@2.0.0: dependencies: mime-types: 3.0.1 @@ -3347,6 +3502,8 @@ snapshots: check-error@2.1.1: {} + classcat@5.0.5: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -3402,6 +3559,47 @@ snapshots: csstype@3.1.3: {} + d3-color@3.1.0: {} + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-ease@3.0.1: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-selection@3.0.0: {} + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + dagre@0.8.5: + dependencies: + graphlib: 2.1.8 + lodash: 4.17.21 + data-urls@6.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -3914,6 +4112,10 @@ snapshots: graphemer@1.4.0: {} + graphlib@2.1.8: + dependencies: + lodash: 4.17.21 + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -4219,6 +4421,8 @@ snapshots: lodash.merge@4.6.2: {} + lodash@4.17.21: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -4921,6 +5125,10 @@ snapshots: dependencies: punycode: 2.3.1 + use-sync-external-store@1.6.0(react@18.3.1): + dependencies: + react: 18.3.1 + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -5088,3 +5296,10 @@ snapshots: yallist@3.1.1: {} yocto-queue@0.1.0: {} + + zustand@4.5.7(@types/react@19.2.2)(react@18.3.1): + dependencies: + use-sync-external-store: 1.6.0(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.2 + react: 18.3.1 diff --git a/src/App.tsx b/src/App.tsx index 13219c2..c70ebdb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,13 +1,18 @@ +import { useState } from "react"; + import { AdvancedFilterBar } from "./components/AdvancedFilterBar"; import { EventsPanel } from "./components/EventsPanel"; import { EventSummary } from "./components/EventSummary"; import { FollowEventsPill } from "./components/FollowEventsPill"; import { LiveControls } from "./components/LiveControls"; +import { OrchestratorGraph } from "./components/OrchestratorGraph"; import { TraceIngestPanel } from "./components/TraceIngestPanel"; import { useLiveStreaming } from "./hooks/useLiveStreaming"; import { useTraceData } from "./hooks/useTraceData"; import { RightPanelSlot } from "./plugins"; +type ViewMode = "list" | "graph"; + export default function App() { const { errors, @@ -33,6 +38,8 @@ export default function App() { pendingCount, } = useLiveStreaming({ appendEvents }); + const [view, setView] = useState("list"); + return (
@@ -58,9 +65,37 @@ export default function App() { onFiles={handleFiles} /> - + {/* --- VIEW TOGGLER --- */} +
+ + +
- + {view === "list" ? ( + + ) : ( + + )} + +
); } -export function EventExtrasSlot({ event }: { event: TracerEvent }) { +export function EventExtrasSlot({ event }: { event: AppTracerEvent }) { const value = useContext(PluginContext); if (value?.EventExtras) return <>{value.EventExtras({ event })}; return null; diff --git a/src/plugins/LatencyBarPlugin.tsx b/src/plugins/LatencyBarPlugin.tsx index b36742e..3a05e9c 100644 --- a/src/plugins/LatencyBarPlugin.tsx +++ b/src/plugins/LatencyBarPlugin.tsx @@ -1,9 +1,10 @@ -import type { ToolResultEvent, TracerEvent } from "@accordkit/tracer"; +import type { AppTracerEvent } from "../types/events"; +import type { ToolResultEvent } from "@accordkit/tracer"; const SLOW_MS = 1000; const MAX_BAR_MS = 3000; -export function LatencyBarPlugin({ event }: { event: TracerEvent }) { +export function LatencyBarPlugin({ event }: { event: AppTracerEvent }) { const dur = getDuration(event); const usage = getUsage(event); @@ -26,7 +27,7 @@ export function LatencyBarPlugin({ event }: { event: TracerEvent }) { ); } -function getDuration(event: TracerEvent): number | undefined { +function getDuration(event: AppTracerEvent): number | undefined { if (event.type === "span") return event.durationMs; if ( "latencyMs" in event && @@ -43,7 +44,7 @@ interface UsageData { costUSD?: number; } -function getUsage(event: TracerEvent): UsageData { +function getUsage(event: AppTracerEvent): UsageData { const usage = (event as Partial<{ usage: UsageData }>).usage ?? {}; return { totalTokens: usage.totalTokens, diff --git a/src/setupTests.ts b/src/setupTests.ts index f6e5ad8..214114e 100644 --- a/src/setupTests.ts +++ b/src/setupTests.ts @@ -1,4 +1,3 @@ -// src/setupTests.ts import "@testing-library/jest-dom/vitest"; import { vi } from "vitest"; @@ -25,7 +24,7 @@ class MockIntersectionObserver implements IntersectionObserver { time: Date.now(), } as IntersectionObserverEntry, ], - this, + this ); } @@ -44,11 +43,39 @@ class MockIntersectionObserver implements IntersectionObserver { vi.stubGlobal("IntersectionObserver", MockIntersectionObserver); +class MockResizeObserver implements ResizeObserver { + private callback: ResizeObserverCallback; + + constructor(callback: ResizeObserverCallback) { + this.callback = callback; + } + + observe(target: Element) { + this.callback( + [ + { target, contentRect: target.getBoundingClientRect() }, + ] as ResizeObserverEntry[], + this + ); + } + + unobserve() { + /* noop */ + } + + disconnect() { + /* noop */ + } +} + +vi.stubGlobal("ResizeObserver", MockResizeObserver); + const globalWindow = globalThis as Window & typeof globalThis & { requestAnimationFrame?: typeof window.requestAnimationFrame; cancelAnimationFrame?: typeof window.cancelAnimationFrame; scrollTo?: typeof window.scrollTo; + DOMMatrixReadOnly?: typeof window.DOMMatrixReadOnly; }; if (typeof globalWindow.requestAnimationFrame !== "function") { @@ -71,3 +98,25 @@ if (typeof globalWindow.scrollTo !== "function") { if (typeof Element.prototype.scrollIntoView !== "function") { Element.prototype.scrollIntoView = vi.fn(); } + +if (typeof globalWindow.DOMMatrixReadOnly !== "function") { + const parseScaleY = (transform?: string) => { + if (!transform || transform === "none") { + return 1; + } + const match = transform.match(/matrix\(([^)]+)\)/); + if (!match) { + return 1; + } + const parts = match[1].split(",").map((p) => Number.parseFloat(p.trim())); + return Number.isFinite(parts[3]) ? parts[3]! : 1; + }; + class MockDOMMatrixReadOnly { + m22: number; + constructor(transform?: string) { + this.m22 = parseScaleY(transform); + } + } + globalWindow.DOMMatrixReadOnly = + MockDOMMatrixReadOnly as unknown as typeof DOMMatrixReadOnly; +} diff --git a/src/types/events.ts b/src/types/events.ts new file mode 100644 index 0000000..93bddf3 --- /dev/null +++ b/src/types/events.ts @@ -0,0 +1,28 @@ +import type { TracerEvent } from "@accordkit/tracer"; + +/** + * Define application's set of span statuses, + * including 'streaming' for live updates. + */ +export type SpanEventStatus = "ok" | "error" | "streaming"; + +/** + * Create a specific, type-safe SpanEvent for our app. + * Omits the original 'status' from the package and replace + * it with our more specific `SpanEventStatus`. + */ +export type AppSpanEvent = Omit< + Extract, + "status" +> & { + status: SpanEventStatus; +}; + +/** + * App's main event type. + * This is a union of custom AppSpanEvent and all other + * event types from the tracer package. + */ +export type AppTracerEvent = + | AppSpanEvent + | Exclude; diff --git a/src/utils/buildSpanTree.ts b/src/utils/buildSpanTree.ts index 96db57b..b8ae456 100644 --- a/src/utils/buildSpanTree.ts +++ b/src/utils/buildSpanTree.ts @@ -1,33 +1,29 @@ -import type { BaseEvent, TracerEvent } from "@accordkit/tracer"; +import type { AppTracerEvent, AppSpanEvent } from "../types/events"; export interface SpanNode { id: string; - event: TracerEvent; + event: AppSpanEvent; children: SpanNode[]; - events: TracerEvent[]; + events: AppTracerEvent[]; } /** Type guard for span events. */ -function isSpanEvent(e: TracerEvent): e is TracerEvent & { - type: "span"; - ctx: { spanId: string; parentSpanId?: string }; - durationMs: number; -} { +function isSpanEvent(e: AppTracerEvent): e is AppSpanEvent { return e.type === "span"; } /** Safely read a span's id. Falls back to a stable synthetic id. */ -function getSpanId(e: TracerEvent): string { - return (e as Extract).ctx.spanId; +function getSpanId(e: AppSpanEvent): string { + return e.ctx.spanId; } /** Safely read a span's parent id, if present. */ -function getParentSpanId(e: TracerEvent): string | undefined { - return isSpanEvent(e) ? e.ctx.parentSpanId : undefined; +function getParentSpanId(e: AppSpanEvent): string | undefined { + return e.ctx.parentSpanId; } /** Normalize timestamps to numbers for sorting. */ -function tsNumber(e: TracerEvent): number { +function tsNumber(e: AppTracerEvent): number { const n = Date.parse(e.ts); return Number.isFinite(n) ? n : 0; } @@ -38,7 +34,7 @@ function tsNumber(e: TracerEvent): number { * - Children are sorted by timestamp. * - Roots are spans without a valid parent. */ -export function buildSpanTree(events: TracerEvent[]): SpanNode[] { +export function buildSpanTree(events: AppTracerEvent[]): SpanNode[] { const nodes = new Map(); // First pass: create nodes for span events @@ -80,9 +76,9 @@ export function buildSpanTree(events: TracerEvent[]): SpanNode[] { } /** Also return top-level non-span events that don't belong to any span. */ -export function buildSpanForest(events: TracerEvent[]): { +export function buildSpanForest(events: AppTracerEvent[]): { roots: SpanNode[]; - orphans: TracerEvent[]; + orphans: AppTracerEvent[]; } { const roots = buildSpanTree(events); const spanIds = new Set(); @@ -94,13 +90,18 @@ export function buildSpanForest(events: TracerEvent[]): { }; roots.forEach(walk); roots.forEach((n) => { - n.events.forEach((e) => parentIds.add(e.ctx.parentSpanId!)); + n.events.forEach((e) => { + if (e.ctx.parentSpanId) { + parentIds.add(e.ctx.parentSpanId); + } + }); }); const orphans = events.filter( (e) => e.type !== "span" && - (!e.ctx?.parentSpanId || !spanIds.has(e.ctx.parentSpanId)), + (!e.ctx?.parentSpanId || !spanIds.has(e.ctx.parentSpanId)) ); + // sort for stable rendering orphans.sort((a, b) => tsNumber(a) - tsNumber(b)); return { roots, orphans }; diff --git a/src/utils/eventFilters.ts b/src/utils/eventFilters.ts index 7c64473..a5230c0 100644 --- a/src/utils/eventFilters.ts +++ b/src/utils/eventFilters.ts @@ -1,6 +1,6 @@ -import type { TracerEvent } from "@accordkit/tracer"; +import type { AppTracerEvent } from "../types/events"; -export type EventType = TracerEvent["type"]; +export type EventType = AppTracerEvent["type"]; export interface FilterState { types: Set | "all"; @@ -18,7 +18,7 @@ export const DEFAULT_FILTERS: FilterState = { q: "", }; -export function extractFacets(events: TracerEvent[]) { +export function extractFacets(events: AppTracerEvent[]) { const types = new Set(); const providers = new Set(); const models = new Set(); @@ -46,7 +46,7 @@ export function buildFilterPredicate(f: FilterState) { const modelAll = f.models === "all" ? null : new Set(f.models); const levelAll = f.levels === "all" ? null : new Set(f.levels); - return (e: TracerEvent): boolean => { + return (e: AppTracerEvent): boolean => { if (typeAll && !typeAll.has(e.type)) return false; if (levelAll && !levelAll.has(e.level)) return false; if (provAll && (!e.provider || !provAll.has(e.provider))) return false; diff --git a/src/utils/graphLayout.ts b/src/utils/graphLayout.ts new file mode 100644 index 0000000..811ef25 --- /dev/null +++ b/src/utils/graphLayout.ts @@ -0,0 +1,186 @@ +// src/utils/graphLayout.ts +import dagre from "dagre"; + +import { type CustomNode } from "../components/graph/types"; +import { type AppTracerEvent } from "../types/events"; + +import { type SpanNode } from "./buildSpanTree"; + +import type { Edge, Node, XYPosition } from "@xyflow/react"; + +interface ForestTransform { + nodes: Node[]; + edges: Edge[]; +} + +interface Forest { + roots: SpanNode[]; + orphans: AppTracerEvent[]; +} + +// Node dimensions (must match CSS) +const NODE_WIDTH = 280; +const SPAN_NODE_HEIGHT = 80; +const EVENT_NODE_HEIGHT = 50; +const HORIZONTAL_GAP = 60; // Space between trees/orphans + +/** + * Transforms our span forest into a node/edge graph for xyflow. + * + * This version lays out each root and orphan as a separate + * component, then arranges them horizontally to prevent overlap. + */ +export function transformForestToFlow(forest: Forest): ForestTransform { + const allNodes: CustomNode[] = []; + const allEdges: Edge[] = []; + let currentXOffset = 0; + + // Layout and add all orphan events + for (const orphan of forest.orphans) { + const { nodes, edges, width } = layoutComponent(orphan); + // Apply the horizontal offset to all nodes in this component + for (const node of nodes) { + node.position.x += currentXOffset; + allNodes.push(node); + } + allEdges.push(...edges); + currentXOffset += width + HORIZONTAL_GAP; + } + + // Layout and add all root span trees + for (const root of forest.roots) { + const { nodes, edges, width } = layoutComponent(root); + // Apply the horizontal offset + for (const node of nodes) { + node.position.x += currentXOffset; + allNodes.push(node); + } + allEdges.push(...edges); + currentXOffset += width + HORIZONTAL_GAP; + } + + return { nodes: allNodes, edges: allEdges }; +} + +/** + * Creates and layouts a new Dagre graph for a single component + * (either one orphan or one root span tree). + */ +function layoutComponent(root: AppTracerEvent | SpanNode) { + const g = new dagre.graphlib.Graph(); + g.setDefaultEdgeLabel(() => ({})); + g.setGraph({ + rankdir: "TB", // Top-to-Bottom layout + nodesep: 40, + ranksep: 50, + }); + + const nodes: CustomNode[] = []; + const edges: Edge[] = []; + + // Add nodes and edges to the Dagre graph + if ("event" in root) { + // It's a SpanNode, traverse the tree + addSpanNodeToGraph(root as SpanNode, g, nodes, edges); + } else { + // It's an orphan AppTracerEvent + const orphan = root as AppTracerEvent; + const id = getEventId(orphan); + nodes.push({ + id, + position: { x: 0, y: 0 }, + data: { label: `Orphan: ${orphan.type}`, event: orphan }, + type: "eventNode", + }); + g.setNode(id, { width: NODE_WIDTH, height: EVENT_NODE_HEIGHT }); + } + + // Run the layout algorithm for *this component only* + dagre.layout(g); + + const graphWidth = g.graph().width ?? NODE_WIDTH; + + // Apply calculated positions to the nodes + const positionedNodes = nodes.map((node) => { + const nodeWithPosition = g.node(node.id); + if (nodeWithPosition) { + node.position = getNodePosition(node, nodeWithPosition); + } + return node; + }); + + return { nodes: positionedNodes, edges, width: graphWidth }; +} + +/** + * Recursively adds span nodes, event nodes, and their edges to a Dagre graph. + */ +function addSpanNodeToGraph( + spanNode: SpanNode, + g: dagre.graphlib.Graph, + nodes: CustomNode[], + edges: Edge[] +) { + const nodeId = spanNode.id; + + nodes.push({ + id: nodeId, + position: { x: 0, y: 0 }, + data: { label: spanNode.event.operation, event: spanNode.event }, + type: "spanNode", + }); + g.setNode(nodeId, { width: NODE_WIDTH, height: SPAN_NODE_HEIGHT }); + + // Add attached non-span events + for (const event of spanNode.events) { + const eventId = getEventId(event); + nodes.push({ + id: eventId, + position: { x: 0, y: 0 }, + data: { label: event.type, event }, + type: "eventNode", + }); + g.setNode(eventId, { width: NODE_WIDTH, height: EVENT_NODE_HEIGHT }); + + edges.push({ + id: `${nodeId}->${eventId}`, + source: nodeId, + target: eventId, + style: { stroke: "#64748b", strokeDasharray: "5 5" }, + }); + g.setEdge(nodeId, eventId); + } + + // Recursively add child spans + for (const child of spanNode.children) { + addSpanNodeToGraph(child, g, nodes, edges); // Recurse + const childId = child.id; + + edges.push({ + id: `${nodeId}->${childId}`, + source: nodeId, + target: childId, + animated: child.event.status === "streaming", + style: { stroke: "#f8fafc", strokeWidth: 2 }, + }); + g.setEdge(nodeId, childId); + } +} + +/** Helper to get a unique ID for non-span events */ +function getEventId(event: AppTracerEvent): string { + return `${event.ctx.traceId}-${event.ctx.spanId}-${event.ts}`; +} + +/** Helper to center the node on its calculated position */ +function getNodePosition( + node: CustomNode, + nodeWithPosition: dagre.Node +): XYPosition { + const height = + node.type === "spanNode" ? SPAN_NODE_HEIGHT : EVENT_NODE_HEIGHT; + return { + x: nodeWithPosition.x - NODE_WIDTH / 2, + y: nodeWithPosition.y - height / 2, + }; +} diff --git a/src/utils/liveClient.ts b/src/utils/liveClient.ts index 8b58e2b..3d1a385 100644 --- a/src/utils/liveClient.ts +++ b/src/utils/liveClient.ts @@ -1,4 +1,6 @@ -import type { TracerEvent } from "@accordkit/tracer"; +import { TracerEvent } from "@accordkit/tracer"; + +import type { AppTracerEvent } from "../types/events"; export type LiveTransport = "sse" | "ws"; diff --git a/src/utils/normalizeEvent.ts b/src/utils/normalizeEvent.ts new file mode 100644 index 0000000..f522190 --- /dev/null +++ b/src/utils/normalizeEvent.ts @@ -0,0 +1,44 @@ +import { + type AppTracerEvent, + type AppSpanEvent, + type SpanEventStatus, +} from "../types/events"; + +import type { TracerEvent } from "@accordkit/tracer"; + +/** + * Validates and normalizes a raw `TracerEvent` from an ingest source + * into our type-safe `AppTracerEvent`. + * + * This function is the "boundary" that ensures our internal + * app state is always clean. + */ +export function normalizeEvent(event: TracerEvent): AppTracerEvent { + if (event.type !== "span") { + // Not a span, so just pass it through. + // It already matches the `Exclude` part of our union. + return event as AppTracerEvent; + } + + // It's a span. We need to validate its status. + const rawStatus = event.status as SpanEventStatus | undefined | string; + let cleanStatus: SpanEventStatus; + + switch (rawStatus) { + case "ok": + case "error": + case "streaming": + cleanStatus = rawStatus; + break; + default: + // If status is missing, "complete", or anything else, + // default it to 'ok' for safe rendering. + cleanStatus = "ok"; + } + + // Re-cast the event to our AppSpanEvent type with the guaranteed-safe status. + return { + ...event, + status: cleanStatus, + } as AppSpanEvent; +} \ No newline at end of file diff --git a/tsconfig.node.tsbuildinfo b/tsconfig.node.tsbuildinfo deleted file mode 100644 index f07789d..0000000 --- a/tsconfig.node.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/globals.typedarray.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/buffer.buffer.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/globals.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/web-globals/crypto.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/web-globals/events.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/utility.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/header.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/readable.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/fetch.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/formdata.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/connector.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/client-stats.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/client.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/errors.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/dispatcher.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/global-dispatcher.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/global-origin.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/pool-stats.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/pool.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/handlers.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/balanced-pool.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/h2c-client.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/agent.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/mock-interceptor.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/mock-call-history.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/mock-agent.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/mock-client.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/mock-pool.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/snapshot-agent.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/mock-errors.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/proxy-agent.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/retry-handler.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/retry-agent.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/api.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/cache-interceptor.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/interceptors.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/util.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/cookies.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/patch.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/websocket.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/eventsource.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/content-type.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/cache.d.ts","../node_modules/.pnpm/undici-types@7.14.0/node_modules/undici-types/index.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/web-globals/storage.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/web-globals/streams.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/assert.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/assert/strict.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/async_hooks.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/buffer.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/child_process.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/cluster.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/console.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/constants.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/crypto.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/dgram.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/dns.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/dns/promises.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/domain.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/events.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/fs.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/fs/promises.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/http.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/http2.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/https.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/inspector.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/inspector.generated.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/module.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/net.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/os.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/path.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/perf_hooks.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/process.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/punycode.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/querystring.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/readline.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/readline/promises.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/repl.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/sea.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/sqlite.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/stream.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/stream/promises.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/stream/consumers.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/stream/web.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/string_decoder.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/test.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/timers.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/timers/promises.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/tls.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/trace_events.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/tty.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/url.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/util.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/v8.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/vm.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/wasi.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/worker_threads.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/zlib.d.ts","../node_modules/.pnpm/@types+node@24.8.1/node_modules/@types/node/index.d.ts","../node_modules/.pnpm/@types+estree@1.0.8/node_modules/@types/estree/index.d.ts","../node_modules/.pnpm/rollup@4.52.5/node_modules/rollup/dist/rollup.d.ts","../node_modules/.pnpm/rollup@4.52.5/node_modules/rollup/dist/parseast.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@24.8.1/node_modules/vite/types/hmrpayload.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@24.8.1/node_modules/vite/types/customevent.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@24.8.1/node_modules/vite/types/hot.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@24.8.1/node_modules/vite/dist/node/types.d-agj9qkwt.d.ts","../node_modules/.pnpm/esbuild@0.21.5/node_modules/esbuild/lib/main.d.ts","../node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/source-map.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/previous-map.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/input.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/css-syntax-error.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/declaration.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/root.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/warning.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/lazy-result.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/no-work-result.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/processor.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/result.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/document.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/rule.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/node.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/comment.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/container.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/at-rule.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/list.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/postcss.d.ts","../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/postcss.d.mts","../node_modules/.pnpm/vite@5.4.21_@types+node@24.8.1/node_modules/vite/dist/node/runtime.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@24.8.1/node_modules/vite/types/importglob.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@24.8.1/node_modules/vite/types/metadata.d.ts","../node_modules/.pnpm/vite@5.4.21_@types+node@24.8.1/node_modules/vite/dist/node/index.d.ts","../node_modules/.pnpm/@babel+types@7.28.4/node_modules/@babel/types/lib/index.d.ts","../node_modules/.pnpm/@types+babel__generator@7.27.0/node_modules/@types/babel__generator/index.d.ts","../node_modules/.pnpm/@babel+parser@7.28.4/node_modules/@babel/parser/typings/babel-parser.d.ts","../node_modules/.pnpm/@types+babel__template@7.4.4/node_modules/@types/babel__template/index.d.ts","../node_modules/.pnpm/@types+babel__traverse@7.28.0/node_modules/@types/babel__traverse/index.d.ts","../node_modules/.pnpm/@types+babel__core@7.20.5/node_modules/@types/babel__core/index.d.ts","../node_modules/.pnpm/@vitejs+plugin-react@5.0.4_vite@5.4.21_@types+node@24.8.1_/node_modules/@vitejs/plugin-react/dist/index.d.ts","./vite.config.ts","../node_modules/.pnpm/@types+react@19.2.2/node_modules/@types/react/global.d.ts","../node_modules/.pnpm/csstype@3.1.3/node_modules/csstype/index.d.ts","../node_modules/.pnpm/@types+react@19.2.2/node_modules/@types/react/index.d.ts","../node_modules/.pnpm/@types+react-dom@19.2.2_@types+react@19.2.2/node_modules/@types/react-dom/index.d.ts","../node_modules/@types/aria-query/index.d.ts","../node_modules/@types/babel__core/index.d.ts","../node_modules/@types/babel__generator/index.d.ts","../node_modules/@types/babel__template/index.d.ts","../node_modules/@types/babel__traverse/index.d.ts","../node_modules/@types/deep-eql/index.d.ts","../node_modules/@types/chai/index.d.ts","../node_modules/@types/estree/index.d.ts","../node_modules/@types/unist/index.d.ts","../node_modules/@types/hast/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/json5/index.d.ts","../node_modules/form-data/index.d.ts","../node_modules/@types/node-fetch/externals.d.ts","../node_modules/@types/node-fetch/index.d.ts"],"fileIdsList":[[62,116,133,134,199],[62,116,133,134],[62,116,133,134,199,200,201,202,203],[62,116,133,134,199,201],[62,113,114,116,133,134],[62,115,116,133,134],[116,133,134],[62,116,121,133,134,151],[62,116,117,122,127,133,134,136,148,159],[62,116,117,118,127,133,134,136],[62,116,119,133,134,160],[62,116,120,121,128,133,134,137],[62,116,121,133,134,148,156],[62,116,122,124,127,133,134,136],[62,115,116,123,133,134],[62,116,124,125,133,134],[62,116,126,127,133,134],[62,115,116,127,133,134],[62,116,127,128,129,133,134,148,159],[62,116,127,128,129,133,134,143,148,151],[62,108,116,124,127,130,133,134,136,148,159],[62,116,127,128,130,131,133,134,136,148,156,159],[62,116,130,132,133,134,148,156,159],[60,61,62,63,64,65,66,67,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[62,116,127,133,134],[62,116,133,134,135,159],[62,116,124,127,133,134,136,148],[62,116,133,134,137],[62,116,133,134,138],[62,115,116,133,134,139],[62,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[62,116,133,134,141],[62,116,133,134,142],[62,116,127,133,134,143,144],[62,116,133,134,143,145,160,162],[62,116,127,133,134,148,149,151],[62,116,133,134,150,151],[62,116,133,134,148,149],[62,116,133,134,151],[62,116,133,134,152],[62,113,116,133,134,148,153],[62,116,127,133,134,154,155],[62,116,133,134,154,155],[62,116,121,133,134,136,148,156],[62,116,133,134,157],[62,116,133,134,136,158],[62,116,130,133,134,142,159],[62,116,121,133,134,160],[62,116,133,134,148,161],[62,116,133,134,135,162],[62,116,133,134,163],[62,116,121,133,134],[62,108,116,133,134],[62,116,133,134,164],[62,108,116,127,129,133,134,139,148,151,159,161,162,164],[62,116,133,134,148,165],[62,116,133,134,209],[62,116,133,134,207,208],[62,116,133,134,198,204],[62,116,133,134,190],[62,116,133,134,188,190],[62,116,133,134,179,187,188,189,191,193],[62,116,133,134,177],[62,116,133,134,180,185,190,193],[62,116,133,134,176,193],[62,116,133,134,180,181,184,185,186,193],[62,116,133,134,180,181,182,184,185,193],[62,116,133,134,177,178,179,180,181,185,186,187,189,190,191,193],[62,116,133,134,193],[62,116,133,134,175,177,178,179,180,181,182,184,185,186,187,188,189,190,191,192],[62,116,133,134,175,193],[62,116,133,134,180,182,183,185,186,193],[62,116,133,134,184,193],[62,116,133,134,185,186,190,193],[62,116,133,134,178,188],[62,116,133,134,168,197],[62,116,133,134,167,168],[62,74,77,80,81,116,133,134,159],[62,77,116,133,134,148,159],[62,77,81,116,133,134,159],[62,116,133,134,148],[62,71,116,133,134],[62,75,116,133,134],[62,73,74,77,116,133,134,159],[62,116,133,134,136,156],[62,116,133,134,166],[62,71,116,133,134,166],[62,73,77,116,133,134,136,159],[62,68,69,70,72,76,116,127,133,134,148,159],[62,77,85,93,116,133,134],[62,69,75,116,133,134],[62,77,102,103,116,133,134],[62,69,72,77,116,133,134,151,159,166],[62,77,116,133,134],[62,73,77,116,133,134,159],[62,68,116,133,134],[62,71,72,73,75,76,77,78,79,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,103,104,105,106,107,116,133,134],[62,77,95,98,116,124,133,134],[62,77,85,86,87,116,133,134],[62,75,77,86,88,116,133,134],[62,76,116,133,134],[62,69,71,77,116,133,134],[62,77,81,86,88,116,133,134],[62,81,116,133,134],[62,75,77,80,116,133,134,159],[62,69,73,77,85,116,133,134],[62,77,95,116,133,134],[62,88,116,133,134],[62,71,77,102,116,133,134,151,164,166],[62,116,127,128,130,131,132,133,134,136,148,156,159,165,166,168,169,170,171,172,173,174,194,195,196,197],[62,116,133,134,170,171,172,173],[62,116,133,134,170,171,172],[62,116,133,134,170],[62,116,133,134,171],[62,116,133,134,168],[62,116,133,134,216],[62,116,133,134,219],[62,116,130,133,134,159,166,223,224],[62,116,130,133,134,148,166],[62,116,133,134,198,205]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0671b50bb99cc7ad46e9c68fa0e7f15ba4bc898b59c31a17ea4611fab5095da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1b2dd1cbeb0cc6ae20795958ba5950395ebb2849b7c8326853dd15530c77ab0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"3c8e93af4d6ce21eb4c8d005ad6dc02e7b5e6781f429d52a35290210f495a674","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"00b21ef538da5a2bbe419e2144f3be50661768e1e039ef2b57bb89f96aff9b18","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"e843e840f484f7e59b2ef9488501a301e3300a8e3e56aa84a02ddf915c7ce07d","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"78b29846349d4dfdd88bd6650cc5d2baaa67f2e89dc8a80c8e26ef7995386583","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"18f8cfbb14ba9405e67d30968ae67b8d19133867d13ebc49c8ed37ec64ce9bdb","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"830171b27c5fdf9bcbe4cf7d428fcf3ae2c67780fb7fbdccdf70d1623d938bc4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa3cdd2c004d79ae3b6bca7b793bce0597734f8d38df2273690ed358a65c1543","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"18334defc3d0a0e1966f5f3c23c7c83b62c77811e51045c5a7ff3883b446f81f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dbcce74b6c46d12dce913fe42bc29d116102b591b53f457d279d5db7316d454","impliedFormat":1},{"version":"51aecd2df90a3cffea1eb4696b33b2d78594ea2aa2138e6b9471ec4841c6c2ee","impliedFormat":1},{"version":"2c91d8366ff2506296191c26fd97cc1990bab3ee22576275d28b654a21261a44","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4ad445a79cb765025431ffff683663c9a249e210a2ba5609129ccccf2ebd5726","impliedFormat":1},{"version":"289e9894a4668c61b5ffed09e196c1f0c2f87ca81efcaebdf6357cfb198dac14","impliedFormat":1},{"version":"9f39e70a354d0fba29ac3cdf6eca00b7f9e96f64b2b2780c432e8ea27f133743","impliedFormat":1},{"version":"0dace96cc0f7bc6d0ee2044921bdf19fe42d16284dbcc8ae200800d1c9579335","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"c64e1888baaa3253ca4405b455e4bf44f76357868a1bd0a52998ade9a092ad78","affectsGlobalScope":true,"impliedFormat":1},{"version":"94d45097aa2cac91ed0da476249a69dccb1d3dd132626ad18eb6002a3e733f3f","impliedFormat":1},{"version":"c6176c7b9f3769ba7f076c7a791588562c653cc0ba08fb2184f87bf78db2a87c","impliedFormat":1},{"version":"8d3f079f853fdcafc015a80c0d7c805965b9bbf594498c9c8a68b2228c4f518d","impliedFormat":1},{"version":"5bc3d3029cf8b7fff54441953c741b3bc2d96bb8ca77c487a6b11d73870e8947","impliedFormat":1},{"version":"19c56ac845f92bff8e28f9c0c96a23e663b07c0da35f33b904ab86c8ac151bfd","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"c0bb1b65757c72bbf8ddf7eaa532223bacf58041ff16c883e76f45506596e925","impliedFormat":1},{"version":"c8b85f7aed29f8f52b813f800611406b0bfe5cf3224d20a4bdda7c7f73ce368e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae55dfb60af917b1b63665200466b8fd7e20d2b01d1b0336b2ce770637cd553e","impliedFormat":1},{"version":"6145728071f93b5d65e85617dbee550ac9fb9943b82b79fc4b5944f80cc2baab","impliedFormat":1},{"version":"76957a6d92b94b9e2852cf527fea32ad2dc0ef50f67fe2b14bd027c9ceef2d86","impliedFormat":1},{"version":"9043daec15206650fa119bad6b8d70136021ea7d52673a71f79a87a42ee38d44","affectsGlobalScope":true,"impliedFormat":1},{"version":"856fb28989bc204dbb69db6b32092b4f31eae13468e85a6561d260cec6ef509d","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"5fb39858b2459864b139950a09adae4f38dad87c25bf572ce414f10e4bd7baab","impliedFormat":1},{"version":"b827f8800f42858f0a751a605c003b7ab571ff7af184436f36cef9bdfebae808","impliedFormat":1},{"version":"b33b74b97952d9bf4fbd2951dcfbb5136656ddb310ce1c84518aaa77dbca9992","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"6b306cd4282bbb54d4a6bb23cfb7a271160983dfc38c67b5a132504cfcc34896","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea713aa14a670b1ea0fbaaca4fd204e645f71ca7653a834a8ec07ee889c45de6","impliedFormat":1},{"version":"450172a56b944c2d83f45cc11c9a388ea967cd301a21202aa0a23c34c7506a18","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"360a81d6186f9afa88d2bf48d4b3cd900d9592b7aaec1041f2289979ee6b762c","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"7dfa742c23851808a77ec27062fbbd381c8c36bb3cfdff46cb8af6c6c233bfc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"5cc88844feb0b67dadbcad5eb1b82e77beff49a42f84759e71da272b4d85afbb","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b3c4e1ec7158fd728cc12da1c71349fd4c19f38d7298a36506ffca0bdad6994","impliedFormat":1},{"version":"13baaeb286956bed7e100e0c91c9751029b87ba6362887e174aca3672417c502","impliedFormat":1},{"version":"0d5b085f36e6dc55bc6332ecb9c733be3a534958c238fb8d8d18d4a2b6f2a15a","impliedFormat":1},{"version":"ef8a439305a531851b34a3f111f9223ba89a89e0e17cd9a96e953129e55bc1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"493c64d062139b1849b0e9c4c3a6465e1227d2b42be9e26ec577ca728984c041","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"67f0933742a1e547fc31cc52c4183b2be0726ffa9689586b761cef241ca6b251","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"282f98006ed7fa9bb2cd9bdbe2524595cfc4bcd58a0bb3232e4519f2138df811","impliedFormat":1},{"version":"6222e987b58abfe92597e1273ad7233626285bc2d78409d4a7b113d81a83496b","impliedFormat":1},{"version":"cbe726263ae9a7bf32352380f7e8ab66ee25b3457137e316929269c19e18a2be","impliedFormat":1},{"version":"8b96046bf5fb0a815cba6b0880d9f97b7f3a93cf187e8dcfe8e2792e97f38f87","impliedFormat":99},{"version":"bacf2c84cf448b2cd02c717ad46c3d7fd530e0c91282888c923ad64810a4d511","affectsGlobalScope":true,"impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","impliedFormat":1},{"version":"333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","impliedFormat":1},{"version":"e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","impliedFormat":1},{"version":"459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","impliedFormat":1},{"version":"4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","impliedFormat":1},{"version":"7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","impliedFormat":1},{"version":"70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","impliedFormat":1},{"version":"d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","impliedFormat":1},{"version":"a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","impliedFormat":1},{"version":"b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","impliedFormat":1},{"version":"644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","impliedFormat":1},{"version":"dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","impliedFormat":1},{"version":"1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","impliedFormat":1},{"version":"47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","impliedFormat":1},{"version":"4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","impliedFormat":1},{"version":"331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"82e687ebd99518bc63ea04b0c3810fb6e50aa6942decd0ca6f7a56d9b9a212a6","impliedFormat":99},{"version":"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","impliedFormat":1},{"version":"8f07f2b6514744ac96e51d7cb8518c0f4de319471237ea10cf688b8d0e9d0225","impliedFormat":1},{"version":"257b83faa134d971c738a6b9e4c47e59bb7b23274719d92197580dd662bfafc3","impliedFormat":99},{"version":"a28ac3e717907284b3910b8e9b3f9844a4e0b0a861bea7b923e5adf90f620330","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"82e5a50e17833a10eb091923b7e429dc846d42f1c6161eb6beeb964288d98a15","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"9514ca3c09ba583cc23dbaba5580e637360590ad3cc3c69049fc6abb88d6d6f1","impliedFormat":99},"b0de926d5ee5cfc446e3dff18c9c6c21533fc7e623aab3c447723f67089db1b3",{"version":"170d4db14678c68178ee8a3d5a990d5afb759ecb6ec44dbd885c50f6da6204f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"0ff1b165090b491f5e1407ae680b9a0bc3806dc56827ec85f93c57390491e732","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1},{"version":"ae77d81a5541a8abb938a0efedf9ac4bea36fb3a24cc28cfa11c598863aba571","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"c8905dbea83f3220676a669366cd8c1acef56af4d9d72a8b2241b1d044bb4302","affectsGlobalScope":true,"impliedFormat":99},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","impliedFormat":1},{"version":"79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"736097ddbb2903bef918bb3b5811ef1c9c5656f2a73bd39b22a91b9cc2525e50","impliedFormat":1},{"version":"4340936f4e937c452ae783514e7c7bbb7fc06d0c97993ff4865370d0962bb9cf","impliedFormat":1},{"version":"b70c7ea83a7d0de17a791d9b5283f664033a96362c42cc4d2b2e0bdaa65ef7d1","impliedFormat":1}],"root":[206],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":99,"noEmitOnError":true,"skipLibCheck":true,"sourceMap":true,"strict":true,"target":9},"referencedMap":[[201,1],[199,2],[204,3],[200,1],[202,4],[203,1],[167,2],[113,5],[114,5],[115,6],[62,7],[116,8],[117,9],[118,10],[60,2],[119,11],[120,12],[121,13],[122,14],[123,15],[124,16],[125,16],[126,17],[127,18],[128,19],[129,20],[63,2],[61,2],[130,21],[131,22],[132,23],[166,24],[133,25],[134,2],[135,26],[136,27],[137,28],[138,29],[139,30],[140,31],[141,32],[142,33],[143,34],[144,34],[145,35],[146,2],[147,2],[148,36],[150,37],[149,38],[151,39],[152,40],[153,41],[154,42],[155,43],[156,44],[157,45],[158,46],[159,47],[160,48],[161,49],[162,50],[163,51],[64,2],[65,52],[66,2],[67,2],[109,53],[110,54],[111,2],[112,39],[164,55],[165,56],[210,57],[207,2],[209,58],[205,59],[208,2],[174,2],[191,60],[189,61],[190,62],[178,63],[179,61],[186,64],[177,65],[182,66],[192,2],[183,67],[188,68],[194,69],[193,70],[176,71],[184,72],[185,73],[180,74],[187,60],[181,75],[169,76],[168,77],[175,2],[58,2],[59,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[20,2],[21,2],[4,2],[22,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[8,2],[49,2],[46,2],[47,2],[48,2],[50,2],[9,2],[51,2],[52,2],[53,2],[55,2],[54,2],[1,2],[56,2],[57,2],[85,78],[97,79],[83,80],[98,81],[107,82],[74,83],[75,84],[73,85],[106,86],[101,87],[105,88],[77,89],[94,90],[76,91],[104,92],[71,93],[72,87],[78,94],[79,2],[84,95],[82,94],[69,96],[108,97],[99,98],[88,99],[87,94],[89,100],[92,101],[86,102],[90,103],[102,86],[80,104],[81,105],[93,106],[70,81],[96,107],[95,94],[91,108],[100,2],[68,2],[103,109],[198,110],[195,111],[173,112],[171,113],[170,2],[172,114],[196,2],[197,115],[211,2],[212,3],[213,1],[214,4],[215,1],[217,116],[216,2],[218,2],[220,117],[221,2],[222,2],[224,2],[225,118],[219,2],[223,119],[206,120]],"semanticDiagnosticsPerFile":[[206,[{"start":170,"length":4,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"The last overload gave the following error.","category":1,"code":2770,"next":[{"messageText":"Object literal may only specify known properties, and 'test' does not exist in type 'UserConfigExport'.","category":1,"code":2353}]}]},"relatedInformation":[{"file":"../node_modules/.pnpm/vite@5.4.21_@types+node@24.8.1/node_modules/vite/dist/node/index.d.ts","start":109028,"length":12,"messageText":"The last overload is declared here.","category":1,"code":2771}]}]]],"affectedFilesPendingEmit":[206],"emitSignatures":[206],"version":"5.9.3"} \ No newline at end of file diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..ac9188d --- /dev/null +++ b/vite.config.js @@ -0,0 +1,14 @@ +/// +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; +export default defineConfig({ + plugins: [react()], + build: { + sourcemap: true, + }, + test: { + globals: true, + environment: "jsdom", + setupFiles: "./vitest.setup.ts", + }, +});