diff --git a/packages/autotool/examples/02_nextjs/actions.ts b/packages/autotool/examples/02_nextjs/actions.ts
index a99a81d8073d592c1106e1fa18230ae00b8bfa90..3c5d12a48f49f7363987b2f3d13c6a4fc4e86930 100644
--- a/packages/autotool/examples/02_nextjs/actions.ts
+++ b/packages/autotool/examples/02_nextjs/actions.ts
@@ -5,9 +5,9 @@ import { runWithStreamableUI } from "@/context";
 import "@/tool";
 import { convertTools } from "@llamaindex/autotool";
 import { createStreamableUI } from "ai/rsc";
-import type { JSX } from "react";
+import type { ReactNode } from "react";
 
-export async function chatWithAI(message: string): Promise<JSX.Element> {
+export async function chatWithAI(message: string): Promise<ReactNode> {
   const agent = new OpenAIAgent({
     tools: convertTools("llamaindex"),
   });
@@ -25,7 +25,7 @@ export async function chatWithAI(message: string): Promise<JSX.Element> {
               uiStream.append("\n");
             },
             write: async (message) => {
-              uiStream.append(message.response.delta);
+              uiStream.append(message.response);
             },
             close: () => {
               uiStream.done();
diff --git a/packages/autotool/package.json b/packages/autotool/package.json
index ae1f918f10a573be85a340b175f1d8b5bbddf424..028ea836e4f27dbf2a27468d276170f125dbf427 100644
--- a/packages/autotool/package.json
+++ b/packages/autotool/package.json
@@ -51,7 +51,7 @@
     "unplugin": "^1.12.2"
   },
   "peerDependencies": {
-    "llamaindex": "^0.6.0",
+    "llamaindex": "workspace:*",
     "openai": "^4",
     "typescript": "^4"
   },
diff --git a/packages/autotool/src/compiler.ts b/packages/autotool/src/compiler.ts
index 701d5f05bfed94bb68decd7fb4f6e5354d422714..4156b6f4dc0d35872e7506443c63dde040f5d8cf 100644
--- a/packages/autotool/src/compiler.ts
+++ b/packages/autotool/src/compiler.ts
@@ -9,7 +9,7 @@ import td from "typedoc";
 import type { SourceMapCompact } from "unplugin";
 import type { InfoString } from "./internal";
 
-export const isToolFile = (url: string) => /tool\.[jt]sx?$/.test(url);
+export const isToolFile = (url: string) => /\.tool\.[jt]sx?$/.test(url);
 export const isJSorTS = (url: string) => /\.m?[jt]sx?$/.test(url);
 
 async function parseRoot(entryPoint: string) {
@@ -28,7 +28,7 @@ async function parseRoot(entryPoint: string) {
   if (project) {
     return app.serializer.projectToObject(project, process.cwd());
   }
-  throw new Error("Failed to parse root");
+  throw new Error(`Failed to parse root ${entryPoint}`);
 }
 
 export async function transformAutoTool(
diff --git a/packages/core/package.json b/packages/core/package.json
index 69fcd004f6b26cf17b210183e3284c887dfa196c..e137126a790d3f9486e95f98f9e5e4cd3a59434d 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -164,7 +164,8 @@
   ],
   "scripts": {
     "dev": "bunchee --watch",
-    "build": "bunchee"
+    "build": "bunchee",
+    "test": "vitest"
   },
   "repository": {
     "type": "git",
@@ -172,10 +173,13 @@
     "url": "https://github.com/himself65/LlamaIndexTS.git"
   },
   "devDependencies": {
+    "@edge-runtime/vm": "^4.0.3",
     "ajv": "^8.17.1",
     "bunchee": "5.3.2",
+    "happy-dom": "^15.7.4",
     "natural": "^8.0.1",
-    "python-format-js": "^1.4.3"
+    "python-format-js": "^1.4.3",
+    "vitest": "^2.1.1"
   },
   "dependencies": {
     "@llamaindex/env": "workspace:*",
diff --git a/packages/core/vitest.workspace.ts b/packages/core/vitest.workspace.ts
new file mode 100644
index 0000000000000000000000000000000000000000..93ceecad5a1c0ca5c582358b3f3f5865e4f8c2c6
--- /dev/null
+++ b/packages/core/vitest.workspace.ts
@@ -0,0 +1,19 @@
+import { defineWorkspace } from "vitest/config";
+
+export default defineWorkspace([
+  {
+    test: {
+      environment: "edge-runtime",
+    },
+  },
+  {
+    test: {
+      environment: "happy-dom",
+    },
+  },
+  {
+    test: {
+      environment: "node",
+    },
+  },
+]);
diff --git a/packages/llamaindex/tests/import.test.ts b/packages/llamaindex/tests/import.test.ts
deleted file mode 100644
index 9bcdd4474ef0e170e1deb729e4557da733d002b1..0000000000000000000000000000000000000000
--- a/packages/llamaindex/tests/import.test.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { expect, test } from "vitest";
-
-test("Node classes should be included in the top level", async () => {
-  const { Document, IndexNode, TextNode, BaseNode } = await import(
-    "llamaindex"
-  );
-  expect(Document).toBeDefined();
-  expect(IndexNode).toBeDefined();
-  expect(TextNode).toBeDefined();
-  expect(BaseNode).toBeDefined();
-});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 553092375bf27205f84832f09bd08445c66a8534..1f368f491bed6033044f2e76ae6dab4ebd1021f7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -245,7 +245,7 @@ importers:
         version: 5.5.4
       vitest:
         specifier: ^2.0.5
-        version: 2.0.5(@types/node@22.5.1)(terser@5.31.6)
+        version: 2.0.5(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6)
       webpack:
         specifier: ^5.94.0
         version: 5.94.0(@swc/core@1.7.22(@swc/helpers@0.5.12))
@@ -382,18 +382,27 @@ importers:
         specifier: ^3.23.8
         version: 3.23.8
     devDependencies:
+      '@edge-runtime/vm':
+        specifier: ^4.0.3
+        version: 4.0.3
       ajv:
         specifier: ^8.17.1
         version: 8.17.1
       bunchee:
         specifier: 5.3.2
         version: 5.3.2(typescript@5.5.4)
+      happy-dom:
+        specifier: ^15.7.4
+        version: 15.7.4
       natural:
         specifier: ^8.0.1
         version: 8.0.1(@aws-sdk/credential-providers@3.637.0)
       python-format-js:
         specifier: ^1.4.3
         version: 1.4.3(patch_hash=th6l7y4oiguwssg6vyt7e3sc3i)
+      vitest:
+        specifier: ^2.1.1
+        version: 2.1.1(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6)
 
   packages/core/tests:
     devDependencies:
@@ -402,7 +411,7 @@ importers:
         version: link:..
       vitest:
         specifier: ^2.0.5
-        version: 2.0.5(@types/node@22.5.1)(terser@5.31.6)
+        version: 2.0.5(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6)
 
   packages/env:
     dependencies:
@@ -436,7 +445,7 @@ importers:
         version: 1.1.2
       vitest:
         specifier: ^2.0.5
-        version: 2.0.5(@types/node@22.5.1)(terser@5.31.6)
+        version: 2.0.5(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6)
 
   packages/experimental:
     dependencies:
@@ -676,7 +685,7 @@ importers:
     devDependencies:
       '@cloudflare/vitest-pool-workers':
         specifier: ^0.4.27
-        version: 0.4.27(@cloudflare/workers-types@4.20240821.1)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.5.3(@types/node@22.5.1)(terser@5.31.6))
+        version: 0.4.27(@cloudflare/workers-types@4.20240821.1)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.5.3(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6))
       '@cloudflare/workers-types':
         specifier: ^4.20240821.1
         version: 4.20240821.1
@@ -691,7 +700,7 @@ importers:
         version: 5.5.4
       vitest:
         specifier: 1.5.3
-        version: 1.5.3(@types/node@22.5.1)(terser@5.31.6)
+        version: 1.5.3(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6)
       wrangler:
         specifier: ^3.73.0
         version: 3.73.0(@cloudflare/workers-types@4.20240821.1)
@@ -851,7 +860,7 @@ importers:
         version: link:..
       vitest:
         specifier: ^2.0.5
-        version: 2.0.5(@types/node@22.5.1)(terser@5.31.6)
+        version: 2.0.5(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6)
 
   packages/llm/openai:
     dependencies:
@@ -2264,6 +2273,14 @@ packages:
       '@docusaurus/types':
         optional: true
 
+  '@edge-runtime/primitives@5.1.0':
+    resolution: {integrity: sha512-bs379S/qL7b9B1fXM3xYe+g2orW7Uy0m8oIudiXLcHQyZLsdd0Gfw9STngFDnaAfAcRN5g+/YEMPSsDqiPm0TQ==}
+    engines: {node: '>=16'}
+
+  '@edge-runtime/vm@4.0.3':
+    resolution: {integrity: sha512-2EKlqxSbZTV4D+XG8DTX+9P1SL+m48ahvNbDuxz+dZkmUZ+ju4hl/m28j7QMbC9kU5S+4HUJCYKCAfA+3gggLw==}
+    engines: {node: '>=16'}
+
   '@emnapi/runtime@1.2.0':
     resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==}
 
@@ -4270,33 +4287,63 @@ packages:
   '@vitest/expect@2.0.5':
     resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==}
 
+  '@vitest/expect@2.1.1':
+    resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==}
+
+  '@vitest/mocker@2.1.1':
+    resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==}
+    peerDependencies:
+      '@vitest/spy': 2.1.1
+      msw: ^2.3.5
+      vite: ^5.0.0
+    peerDependenciesMeta:
+      msw:
+        optional: true
+      vite:
+        optional: true
+
   '@vitest/pretty-format@2.0.5':
     resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==}
 
+  '@vitest/pretty-format@2.1.1':
+    resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==}
+
   '@vitest/runner@1.5.3':
     resolution: {integrity: sha512-7PlfuReN8692IKQIdCxwir1AOaP5THfNkp0Uc4BKr2na+9lALNit7ub9l3/R7MP8aV61+mHKRGiqEKRIwu6iiQ==}
 
   '@vitest/runner@2.0.5':
     resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==}
 
+  '@vitest/runner@2.1.1':
+    resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==}
+
   '@vitest/snapshot@1.5.3':
     resolution: {integrity: sha512-K3mvIsjyKYBhNIDujMD2gfQEzddLe51nNOAf45yKRt/QFJcUIeTQd2trRvv6M6oCBHNVnZwFWbQ4yj96ibiDsA==}
 
   '@vitest/snapshot@2.0.5':
     resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==}
 
+  '@vitest/snapshot@2.1.1':
+    resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==}
+
   '@vitest/spy@1.5.3':
     resolution: {integrity: sha512-Llj7Jgs6lbnL55WoshJUUacdJfjU2honvGcAJBxhra5TPEzTJH8ZuhI3p/JwqqfnTr4PmP7nDmOXP53MS7GJlg==}
 
   '@vitest/spy@2.0.5':
     resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==}
 
+  '@vitest/spy@2.1.1':
+    resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==}
+
   '@vitest/utils@1.5.3':
     resolution: {integrity: sha512-rE9DTN1BRhzkzqNQO+kw8ZgfeEBCLXiHJwetk668shmNBpSagQxneT5eSqEBLP+cqSiAeecvQmbpFfdMyLcIQA==}
 
   '@vitest/utils@2.0.5':
     resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==}
 
+  '@vitest/utils@2.1.1':
+    resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==}
+
   '@vladfrangu/async_event_emitter@2.4.3':
     resolution: {integrity: sha512-wn15EJHUk2RDtCw6wVJndUhFbfJYwyNhSD9s+yiQi5c2MmXDy3KLWvZ5LrcOzt3CHdscoAnaJrxIRKBI1QQgGw==}
     engines: {node: '>=v14.0.0', npm: '>=7.0.0'}
@@ -6642,6 +6689,10 @@ packages:
     engines: {node: '>=0.4.7'}
     hasBin: true
 
+  happy-dom@15.7.4:
+    resolution: {integrity: sha512-r1vadDYGMtsHAAsqhDuk4IpPvr6N8MGKy5ntBo7tSdim+pWDxus2PNqOcOt8LuDZ4t3KJHE+gCuzupcx/GKnyQ==}
+    engines: {node: '>=18.0.0'}
+
   has-bigints@1.0.2:
     resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
 
@@ -10304,6 +10355,9 @@ packages:
   tinybench@2.9.0:
     resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
 
+  tinyexec@0.3.0:
+    resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==}
+
   tinypool@0.8.4:
     resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==}
     engines: {node: '>=14.0.0'}
@@ -10727,6 +10781,11 @@ packages:
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
 
+  vite-node@2.1.1:
+    resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+
   vite-plugin-wasm@3.3.0:
     resolution: {integrity: sha512-tVhz6w+W9MVsOCHzxo6SSMSswCeIw4HTrXEi6qL3IRzATl83jl09JVO1djBqPSwfjgnpVHNLYcaMbaDX5WB/pg==}
     peerDependencies:
@@ -10813,6 +10872,31 @@ packages:
       jsdom:
         optional: true
 
+  vitest@2.1.1:
+    resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+    peerDependencies:
+      '@edge-runtime/vm': '*'
+      '@types/node': ^18.0.0 || >=20.0.0
+      '@vitest/browser': 2.1.1
+      '@vitest/ui': 2.1.1
+      happy-dom: '*'
+      jsdom: '*'
+    peerDependenciesMeta:
+      '@edge-runtime/vm':
+        optional: true
+      '@types/node':
+        optional: true
+      '@vitest/browser':
+        optional: true
+      '@vitest/ui':
+        optional: true
+      happy-dom:
+        optional: true
+      jsdom:
+        optional: true
+
   vue@3.4.38:
     resolution: {integrity: sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==}
     peerDependencies:
@@ -10932,6 +11016,10 @@ packages:
   whatwg-fetch@3.6.20:
     resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
 
+  whatwg-mimetype@3.0.0:
+    resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
+    engines: {node: '>=12'}
+
   whatwg-url@13.0.0:
     resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==}
     engines: {node: '>=16'}
@@ -13032,7 +13120,7 @@ snapshots:
     dependencies:
       mime: 3.0.0
 
-  '@cloudflare/vitest-pool-workers@0.4.27(@cloudflare/workers-types@4.20240821.1)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.5.3(@types/node@22.5.1)(terser@5.31.6))':
+  '@cloudflare/vitest-pool-workers@0.4.27(@cloudflare/workers-types@4.20240821.1)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.5.3(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6))':
     dependencies:
       '@vitest/runner': 1.5.3
       '@vitest/snapshot': 1.5.3
@@ -13042,7 +13130,7 @@ snapshots:
       esbuild: 0.17.19
       miniflare: 3.20240821.0
       semver: 7.6.3
-      vitest: 1.5.3(@types/node@22.5.1)(terser@5.31.6)
+      vitest: 1.5.3(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6)
       wrangler: 3.73.0(@cloudflare/workers-types@4.20240821.1)
       zod: 3.23.8
     transitivePeerDependencies:
@@ -13801,6 +13889,12 @@ snapshots:
       - uglify-js
       - webpack-cli
 
+  '@edge-runtime/primitives@5.1.0': {}
+
+  '@edge-runtime/vm@4.0.3':
+    dependencies:
+      '@edge-runtime/primitives': 5.1.0
+
   '@emnapi/runtime@1.2.0':
     dependencies:
       tslib: 2.7.0
@@ -15735,10 +15829,29 @@ snapshots:
       chai: 5.1.1
       tinyrainbow: 1.2.0
 
+  '@vitest/expect@2.1.1':
+    dependencies:
+      '@vitest/spy': 2.1.1
+      '@vitest/utils': 2.1.1
+      chai: 5.1.1
+      tinyrainbow: 1.2.0
+
+  '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6))':
+    dependencies:
+      '@vitest/spy': 2.1.1
+      estree-walker: 3.0.3
+      magic-string: 0.30.11
+    optionalDependencies:
+      vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6)
+
   '@vitest/pretty-format@2.0.5':
     dependencies:
       tinyrainbow: 1.2.0
 
+  '@vitest/pretty-format@2.1.1':
+    dependencies:
+      tinyrainbow: 1.2.0
+
   '@vitest/runner@1.5.3':
     dependencies:
       '@vitest/utils': 1.5.3
@@ -15750,6 +15863,11 @@ snapshots:
       '@vitest/utils': 2.0.5
       pathe: 1.1.2
 
+  '@vitest/runner@2.1.1':
+    dependencies:
+      '@vitest/utils': 2.1.1
+      pathe: 1.1.2
+
   '@vitest/snapshot@1.5.3':
     dependencies:
       magic-string: 0.30.11
@@ -15762,6 +15880,12 @@ snapshots:
       magic-string: 0.30.11
       pathe: 1.1.2
 
+  '@vitest/snapshot@2.1.1':
+    dependencies:
+      '@vitest/pretty-format': 2.1.1
+      magic-string: 0.30.11
+      pathe: 1.1.2
+
   '@vitest/spy@1.5.3':
     dependencies:
       tinyspy: 2.2.1
@@ -15770,6 +15894,10 @@ snapshots:
     dependencies:
       tinyspy: 3.0.0
 
+  '@vitest/spy@2.1.1':
+    dependencies:
+      tinyspy: 3.0.0
+
   '@vitest/utils@1.5.3':
     dependencies:
       diff-sequences: 29.6.3
@@ -15784,6 +15912,12 @@ snapshots:
       loupe: 3.1.1
       tinyrainbow: 1.2.0
 
+  '@vitest/utils@2.1.1':
+    dependencies:
+      '@vitest/pretty-format': 2.1.1
+      loupe: 3.1.1
+      tinyrainbow: 1.2.0
+
   '@vladfrangu/async_event_emitter@2.4.3': {}
 
   '@vue/compiler-core@3.4.38':
@@ -18760,6 +18894,12 @@ snapshots:
     optionalDependencies:
       uglify-js: 3.19.3
 
+  happy-dom@15.7.4:
+    dependencies:
+      entities: 4.5.0
+      webidl-conversions: 7.0.0
+      whatwg-mimetype: 3.0.0
+
   has-bigints@1.0.2: {}
 
   has-flag@3.0.0: {}
@@ -23149,6 +23289,8 @@ snapshots:
 
   tinybench@2.9.0: {}
 
+  tinyexec@0.3.0: {}
+
   tinypool@0.8.4: {}
 
   tinypool@1.0.1: {}
@@ -23597,6 +23739,23 @@ snapshots:
       - supports-color
       - terser
 
+  vite-node@2.1.1(@types/node@22.5.1)(terser@5.31.6):
+    dependencies:
+      cac: 6.7.14
+      debug: 4.3.6
+      pathe: 1.1.2
+      vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6)
+    transitivePeerDependencies:
+      - '@types/node'
+      - less
+      - lightningcss
+      - sass
+      - sass-embedded
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+
   vite-plugin-wasm@3.3.0(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6)):
     dependencies:
       vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6)
@@ -23611,7 +23770,7 @@ snapshots:
       fsevents: 2.3.3
       terser: 5.31.6
 
-  vitest@1.5.3(@types/node@22.5.1)(terser@5.31.6):
+  vitest@1.5.3(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6):
     dependencies:
       '@vitest/expect': 1.5.3
       '@vitest/runner': 1.5.3
@@ -23634,7 +23793,9 @@ snapshots:
       vite-node: 1.5.3(@types/node@22.5.1)(terser@5.31.6)
       why-is-node-running: 2.3.0
     optionalDependencies:
+      '@edge-runtime/vm': 4.0.3
       '@types/node': 22.5.1
+      happy-dom: 15.7.4
     transitivePeerDependencies:
       - less
       - lightningcss
@@ -23645,7 +23806,7 @@ snapshots:
       - supports-color
       - terser
 
-  vitest@2.0.5(@types/node@22.5.1)(terser@5.31.6):
+  vitest@2.0.5(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6):
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@vitest/expect': 2.0.5
@@ -23667,10 +23828,48 @@ snapshots:
       vite-node: 2.0.5(@types/node@22.5.1)(terser@5.31.6)
       why-is-node-running: 2.3.0
     optionalDependencies:
+      '@edge-runtime/vm': 4.0.3
+      '@types/node': 22.5.1
+      happy-dom: 15.7.4
+    transitivePeerDependencies:
+      - less
+      - lightningcss
+      - sass
+      - sass-embedded
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+
+  vitest@2.1.1(@edge-runtime/vm@4.0.3)(@types/node@22.5.1)(happy-dom@15.7.4)(terser@5.31.6):
+    dependencies:
+      '@vitest/expect': 2.1.1
+      '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6))
+      '@vitest/pretty-format': 2.1.1
+      '@vitest/runner': 2.1.1
+      '@vitest/snapshot': 2.1.1
+      '@vitest/spy': 2.1.1
+      '@vitest/utils': 2.1.1
+      chai: 5.1.1
+      debug: 4.3.6
+      magic-string: 0.30.11
+      pathe: 1.1.2
+      std-env: 3.7.0
+      tinybench: 2.9.0
+      tinyexec: 0.3.0
+      tinypool: 1.0.1
+      tinyrainbow: 1.2.0
+      vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6)
+      vite-node: 2.1.1(@types/node@22.5.1)(terser@5.31.6)
+      why-is-node-running: 2.3.0
+    optionalDependencies:
+      '@edge-runtime/vm': 4.0.3
       '@types/node': 22.5.1
+      happy-dom: 15.7.4
     transitivePeerDependencies:
       - less
       - lightningcss
+      - msw
       - sass
       - sass-embedded
       - stylus
@@ -23907,6 +24106,8 @@ snapshots:
 
   whatwg-fetch@3.6.20: {}
 
+  whatwg-mimetype@3.0.0: {}
+
   whatwg-url@13.0.0:
     dependencies:
       tr46: 4.1.1
diff --git a/turbo.json b/turbo.json
index 4d5f877753d701141f3251cfd5612f0100743301..75090181c02e0903eff461a5f9074c38bc03ff6e 100644
--- a/turbo.json
+++ b/turbo.json
@@ -10,11 +10,11 @@
       "dependsOn": ["^build"]
     },
     "test": {
-      "dependsOn": ["^build"]
+      "dependsOn": ["^build", "build"]
     },
     "circular-check": {},
     "e2e": {
-      "dependsOn": ["^build"]
+      "dependsOn": ["^build", "build"]
     },
     "dev": {
       "cache": false,