diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 9a076928b58f1ccfc9c7837901cab00ed7c4da2b..bfef176f5ca99b228f5e7d8b622a61ea8a3bb31f 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -61,10 +61,13 @@ jobs:
         run: pnpm run build --filter llamaindex
       - name: Copy examples
         run: rsync -rv --exclude=node_modules ./examples ${{ runner.temp }}
-      - name: Pack
+      - name: Pack @llamaindex/env
+        run: pnpm pack --pack-destination ${{ runner.temp }}
+        working-directory: packages/env
+      - name: Pack llamaindex
         run: pnpm pack --pack-destination ${{ runner.temp }}
         working-directory: packages/core
-      - name: Install llamaindex
+      - name: Install
         run: npm add ${{ runner.temp }}/*.tgz
         working-directory: ${{ runner.temp }}/examples
       - name: Run Type Check
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 6c61f975722f67002db9e59a89a88d2c138c18fb..2e30bf86b8481cc1c35f8974ef3f47424ce1063d 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -5,7 +5,6 @@
   "[xml]": {
     "editor.defaultFormatter": "redhat.vscode-xml"
   },
-  "jest.rootPath": "./packages/core",
   "[python]": {
     "editor.defaultFormatter": "ms-python.black-formatter"
   },
diff --git a/examples/ollama.ts b/examples/ollama.ts
index 57b2b781bb7755fafbcf0357dc337c011d696fec..d5cd145e6f5973b11ff8267fb0f1dd8154535791 100644
--- a/examples/ollama.ts
+++ b/examples/ollama.ts
@@ -1,4 +1,4 @@
-import { Ollama } from "llamaindex";
+import { Ollama } from "llamaindex/llm/ollama";
 
 (async () => {
   const llm = new Ollama({ model: "llama2", temperature: 0.75 });
diff --git a/package.json b/package.json
index 217c8f0a52e12d3b25201688ed60ff889329b325..0a441a11ac24afb0747a62ac357593443571577d 100644
--- a/package.json
+++ b/package.json
@@ -18,15 +18,12 @@
   },
   "devDependencies": {
     "@changesets/cli": "^2.27.1",
-    "@types/jest": "^29.5.12",
     "eslint": "^8.56.0",
     "eslint-config-custom": "workspace:*",
     "husky": "^9.0.10",
-    "jest": "^29.7.0",
     "lint-staged": "^15.2.2",
     "prettier": "^3.2.5",
     "prettier-plugin-organize-imports": "^3.2.4",
-    "ts-jest": "^29.1.2",
     "turbo": "^1.12.3",
     "typescript": "^5.3.3"
   },
diff --git a/packages/core/.cjs.swcrc b/packages/core/.cjs.swcrc
new file mode 100644
index 0000000000000000000000000000000000000000..14193839df49abbada7bcc60e6fe4bc73a477b42
--- /dev/null
+++ b/packages/core/.cjs.swcrc
@@ -0,0 +1,11 @@
+{
+  "jsc": {
+    "parser": {
+      "syntax": "typescript"
+    },
+    "target": "esnext"
+  },
+  "module": {
+    "type": "commonjs"
+  }
+}
diff --git a/packages/core/.swcrc b/packages/core/.swcrc
new file mode 100644
index 0000000000000000000000000000000000000000..60e144e7209dd5b8297d793f22a7a9c1cc49c215
--- /dev/null
+++ b/packages/core/.swcrc
@@ -0,0 +1,8 @@
+{
+  "jsc": {
+    "parser": {
+      "syntax": "typescript"
+    },
+    "target": "esnext"
+  }
+}
diff --git a/packages/core/jest.config.cjs b/packages/core/jest.config.cjs
deleted file mode 100644
index 3f6d6b1470c105da06953348d096b8a6c7ed025c..0000000000000000000000000000000000000000
--- a/packages/core/jest.config.cjs
+++ /dev/null
@@ -1,6 +0,0 @@
-/** @type {import('ts-jest').JestConfigWithTsJest} */
-module.exports = {
-  preset: "ts-jest",
-  testEnvironment: "node",
-  testPathIgnorePatterns: ["/lib/", "/node_modules/", "/dist/"],
-};
diff --git a/packages/core/package.json b/packages/core/package.json
index bf31b6e6914f62ce11b46c562df0c2ee16c7e97f..9e9de9d429c13a338589d64f4e04c0efd243e543 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -3,9 +3,13 @@
   "private": true,
   "version": "0.1.12",
   "license": "MIT",
+  "type": "module",
   "dependencies": {
     "@anthropic-ai/sdk": "^0.13.0",
+    "@aws-crypto/sha256-js": "^5.2.0",
     "@datastax/astra-db-ts": "^0.1.4",
+    "@llamaindex/cloud": "^0.0.1",
+    "@llamaindex/env": "workspace:*",
     "@mistralai/mistralai": "^0.0.10",
     "@notionhq/client": "^2.2.14",
     "@pinecone-database/pinecone": "^2.0.1",
@@ -34,171 +38,46 @@
     "wink-nlp": "^1.14.3"
   },
   "devDependencies": {
-    "@aws-crypto/sha256-js": "^5.2.0",
-    "@llamaindex/cloud": "^0.0.1",
-    "@types/edit-json-file": "^1.7.3",
-    "@types/jest": "^29.5.12",
+    "@swc/cli": "^0.3.9",
+    "@swc/core": "^1.4.2",
     "@types/lodash": "^4.14.202",
     "@types/node": "^18.19.14",
     "@types/papaparse": "^5.3.14",
     "@types/pg": "^8.11.0",
-    "bunchee": "^4.4.6",
-    "edit-json-file": "^1.8.0",
+    "concurrently": "^8.2.2",
+    "glob": "^10.3.10",
     "madge": "^6.1.0",
     "typescript": "^5.3.3"
   },
   "engines": {
     "node": ">=18.0.0"
   },
-  "types": "./dist/index.d.ts",
-  "main": "./dist/index.js",
+  "types": "./dist/type/index.d.ts",
+  "main": "./dist/cjs/index.cjs",
   "exports": {
     ".": {
-      "types": "./dist/index.d.mts",
-      "import": "./dist/index.mjs",
-      "edge-light": "./dist/index.edge-light.mjs",
-      "require": "./dist/index.js"
-    },
-    "./env": {
-      "types": "./dist/env.d.mts",
-      "import": "./dist/env.mjs",
-      "edge-light": "./dist/env.edge-light.mjs",
-      "require": "./dist/env.js"
-    },
-    "./ChatEngine": {
-      "types": "./dist/ChatEngine.d.mts",
-      "import": "./dist/ChatEngine.mjs",
-      "require": "./dist/ChatEngine.js"
-    },
-    "./ChatHistory": {
-      "types": "./dist/ChatHistory.d.mts",
-      "import": "./dist/ChatHistory.mjs",
-      "require": "./dist/ChatHistory.js"
-    },
-    "./constants": {
-      "types": "./dist/constants.d.mts",
-      "import": "./dist/constants.mjs",
-      "require": "./dist/constants.js"
-    },
-    "./GlobalsHelper": {
-      "types": "./dist/GlobalsHelper.d.mts",
-      "import": "./dist/GlobalsHelper.mjs",
-      "require": "./dist/GlobalsHelper.js"
-    },
-    "./Node": {
-      "types": "./dist/Node.d.mts",
-      "import": "./dist/Node.mjs",
-      "require": "./dist/Node.js"
-    },
-    "./OutputParser": {
-      "types": "./dist/OutputParser.d.mts",
-      "import": "./dist/OutputParser.mjs",
-      "require": "./dist/OutputParser.js"
-    },
-    "./Prompt": {
-      "types": "./dist/Prompt.d.mts",
-      "import": "./dist/Prompt.mjs",
-      "require": "./dist/Prompt.js"
-    },
-    "./PromptHelper": {
-      "types": "./dist/PromptHelper.d.mts",
-      "import": "./dist/PromptHelper.mjs",
-      "require": "./dist/PromptHelper.js"
-    },
-    "./QueryEngine": {
-      "types": "./dist/QueryEngine.d.mts",
-      "import": "./dist/QueryEngine.mjs",
-      "require": "./dist/QueryEngine.js"
-    },
-    "./QuestionGenerator": {
-      "types": "./dist/QuestionGenerator.d.mts",
-      "import": "./dist/QuestionGenerator.mjs",
-      "require": "./dist/QuestionGenerator.js"
-    },
-    "./Response": {
-      "types": "./dist/Response.d.mts",
-      "import": "./dist/Response.mjs",
-      "require": "./dist/Response.js"
-    },
-    "./ServiceContext": {
-      "types": "./dist/ServiceContext.d.mts",
-      "import": "./dist/ServiceContext.mjs",
-      "require": "./dist/ServiceContext.js"
-    },
-    "./TextSplitter": {
-      "types": "./dist/TextSplitter.d.mts",
-      "import": "./dist/TextSplitter.mjs",
-      "require": "./dist/TextSplitter.js"
-    },
-    "./tools": {
-      "types": "./dist/tools.d.mts",
-      "import": "./dist/tools.mjs",
-      "require": "./dist/tools.js"
-    },
-    "./objects": {
-      "types": "./dist/objects.d.mts",
-      "import": "./dist/objects.mjs",
-      "require": "./dist/objects.js"
-    },
-    "./readers": {
-      "types": "./dist/readers.d.mts",
-      "import": "./dist/readers.mjs",
-      "require": "./dist/readers.js"
-    },
-    "./readers/AssemblyAIReader": {
-      "types": "./dist/readers/AssemblyAIReader.d.mts",
-      "import": "./dist/readers/AssemblyAIReader.mjs",
-      "require": "./dist/readers/AssemblyAIReader.js"
-    },
-    "./readers/CSVReader": {
-      "types": "./dist/readers/CSVReader.d.mts",
-      "import": "./dist/readers/CSVReader.mjs",
-      "require": "./dist/readers/CSVReader.js"
-    },
-    "./readers/DocxReader": {
-      "types": "./dist/readers/DocxReader.d.mts",
-      "import": "./dist/readers/DocxReader.mjs",
-      "require": "./dist/readers/DocxReader.js"
-    },
-    "./readers/HTMLReader": {
-      "types": "./dist/readers/HTMLReader.d.mts",
-      "import": "./dist/readers/HTMLReader.mjs",
-      "require": "./dist/readers/HTMLReader.js"
-    },
-    "./readers/ImageReader": {
-      "types": "./dist/readers/ImageReader.d.mts",
-      "import": "./dist/readers/ImageReader.mjs",
-      "require": "./dist/readers/ImageReader.js"
-    },
-    "./readers/MarkdownReader": {
-      "types": "./dist/readers/MarkdownReader.d.mts",
-      "import": "./dist/readers/MarkdownReader.mjs",
-      "require": "./dist/readers/MarkdownReader.js"
-    },
-    "./readers/NotionReader": {
-      "types": "./dist/readers/NotionReader.d.mts",
-      "import": "./dist/readers/NotionReader.mjs",
-      "require": "./dist/readers/NotionReader.js"
-    },
-    "./readers/PDFReader": {
-      "types": "./dist/readers/PDFReader.d.mts",
-      "import": "./dist/readers/PDFReader.mjs",
-      "require": "./dist/readers/PDFReader.js"
-    },
-    "./readers/SimpleDirectoryReader": {
-      "types": "./dist/readers/SimpleDirectoryReader.d.mts",
-      "import": "./dist/readers/SimpleDirectoryReader.mjs",
-      "require": "./dist/readers/SimpleDirectoryReader.js"
-    },
-    "./readers/SimpleMongoReader": {
-      "types": "./dist/readers/SimpleMongoReader.d.mts",
-      "import": "./dist/readers/SimpleMongoReader.mjs",
-      "require": "./dist/readers/SimpleMongoReader.js"
-    },
-    "./cloud": {
-      "types": "./dist/cloud.d.mts",
-      "import": "./dist/cloud.mjs",
-      "require": "./dist/cloud.js"
+      "import": {
+        "types": "./dist/type/index.d.ts",
+        "default": "./dist/index.js"
+      },
+      "edge-light": {
+        "types": "./dist/type/index.d.ts",
+        "default": "./dist/index.edge-light.js"
+      },
+      "require": {
+        "types": "./dist/type/index.d.ts",
+        "default": "./dist/cjs/index.cjs"
+      }
+    },
+    "./*": {
+      "import": {
+        "types": "./dist/type/*.d.ts",
+        "default": "./dist/*.js"
+      },
+      "require": {
+        "types": "./dist/type/*.d.ts",
+        "default": "./dist/cjs/*.cjs"
+      }
     }
   },
   "files": [
@@ -211,13 +90,11 @@
   },
   "scripts": {
     "lint": "eslint .",
-    "test": "jest",
-    "build": "rm -rf ./dist && NODE_OPTIONS=\"--max-old-space-size=12288\" bunchee",
-    "postbuild": "pnpm run copy && pnpm run modify-package-json",
-    "copy": "cp -r package.json CHANGELOG.md ../../README.md ../../LICENSE examples src dist/",
-    "modify-package-json": "node ./scripts/modify-package-json.mjs",
-    "prepublish": "pnpm run modify-package-json && echo \"please cd ./dist and run pnpm publish\" && exit 1",
-    "dev": "NODE_OPTIONS=\"--max-old-space-size=16384\" bunchee -w",
-    "circular-check": "madge -c ./src/index.ts"
+    "build": "rm -rf ./dist && pnpm run build:esm && pnpm run build:cjs && pnpm run build:type",
+    "build:esm": "swc src -d dist --strip-leading-paths --config-file .swcrc",
+    "build:cjs": "swc src -d dist/cjs --strip-leading-paths --config-file .cjs.swcrc --out-file-extension cjs",
+    "build:type": "tsc -p tsconfig.json",
+    "circular-check": "madge -c ./src/index.ts",
+    "dev": "concurrently \"pnpm run build:esm --watch\" \"pnpm run build:cjs --watch\" \"pnpm run build:type --watch\""
   }
 }
diff --git a/packages/core/scripts/modify-package-json.mjs b/packages/core/scripts/modify-package-json.mjs
deleted file mode 100755
index 6f529a58124b25f4980ed73ceb3164abbb084988..0000000000000000000000000000000000000000
--- a/packages/core/scripts/modify-package-json.mjs
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env node
-/**
- * This script is used to modify the package.json file in the dist folder
- * so that it can be published to npm.
- */
-import editJsonFile from "edit-json-file";
-import fs from "node:fs/promises";
-
-{
-  await fs.copyFile("./package.json", "./dist/package.json");
-  const file = editJsonFile("./dist/package.json");
-
-  file.unset("scripts");
-  file.unset("private");
-  await new Promise((resolve) => file.save(resolve));
-}
-{
-  const packageJson = await fs.readFile("./dist/package.json", "utf8");
-  const modifiedPackageJson = packageJson.replaceAll("./dist/", "./");
-  await fs.writeFile(
-    "./dist/package.json",
-    JSON.stringify(JSON.parse(modifiedPackageJson), null, 2),
-    "utf8",
-  );
-}
diff --git a/packages/core/src/ChatHistory.ts b/packages/core/src/ChatHistory.ts
index 52f692156f27eb0882a44f1eaaafcdc8cd22fe9a..31ff9dd707cc81c4cc519ee4598b5abcfa646733 100644
--- a/packages/core/src/ChatHistory.ts
+++ b/packages/core/src/ChatHistory.ts
@@ -1,10 +1,10 @@
-import { OpenAI } from "./llm/LLM";
-import { ChatMessage, LLM, MessageType } from "./llm/types";
+import { OpenAI } from "./llm/LLM.js";
+import { ChatMessage, LLM, MessageType } from "./llm/types.js";
 import {
   defaultSummaryPrompt,
   messagesToHistoryStr,
   SummaryPrompt,
-} from "./Prompt";
+} from "./Prompt.js";
 
 /**
  * A ChatHistory is used to keep the state of back and forth chat messages
diff --git a/packages/core/src/GlobalsHelper.ts b/packages/core/src/GlobalsHelper.ts
index a6bd825002a9ff02994345a10ad75eec1272cdca..7df884840b6158ccc1e6555eeb8d0b3280d95978 100644
--- a/packages/core/src/GlobalsHelper.ts
+++ b/packages/core/src/GlobalsHelper.ts
@@ -1,7 +1,7 @@
 import { encodingForModel } from "js-tiktoken";
 
-import { Event, EventTag, EventType } from "./callbacks/CallbackManager";
-import { randomUUID } from "./env";
+import { randomUUID } from "@llamaindex/env";
+import { Event, EventTag, EventType } from "./callbacks/CallbackManager.js";
 
 export enum Tokenizers {
   CL100K_BASE = "cl100k_base",
diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts
index 99ae46af656cbc4a3abbab635a09b1477c86f192..b03a6d2c5a48cf3bf2f0294465a749db2bbc4d1e 100644
--- a/packages/core/src/Node.ts
+++ b/packages/core/src/Node.ts
@@ -1,5 +1,5 @@
+import { createSHA256, path, randomUUID } from "@llamaindex/env";
 import _ from "lodash";
-import { createSHA256, path, randomUUID } from "./env";
 
 export enum NodeRelationship {
   SOURCE = "SOURCE",
diff --git a/packages/core/src/OutputParser.ts b/packages/core/src/OutputParser.ts
index de356f6a83aeca58ba91dd12ac00ffa1999cf79a..37f016f5bea2ed3296ef979e34fdb5ae4eaa30e0 100644
--- a/packages/core/src/OutputParser.ts
+++ b/packages/core/src/OutputParser.ts
@@ -1,5 +1,5 @@
-import { SubQuestion } from "./engines/query/types";
-import { BaseOutputParser, StructuredOutput } from "./types";
+import { SubQuestion } from "./engines/query/types.js";
+import { BaseOutputParser, StructuredOutput } from "./types.js";
 
 /**
  * Error class for output parsing. Due to the nature of LLMs, anytime we use LLM
diff --git a/packages/core/src/Prompt.ts b/packages/core/src/Prompt.ts
index 41888540e78a371a6305ed6bb7667d529f3de8d7..bf967d15c1eb1487cd4d4110e49334c31e30b068 100644
--- a/packages/core/src/Prompt.ts
+++ b/packages/core/src/Prompt.ts
@@ -1,6 +1,6 @@
-import { SubQuestion } from "./engines/query/types";
-import { ChatMessage } from "./llm/types";
-import { ToolMetadata } from "./types";
+import { SubQuestion } from "./engines/query/types.js";
+import { ChatMessage } from "./llm/types.js";
+import { ToolMetadata } from "./types.js";
 
 /**
  * A SimplePrompt is a function that takes a dictionary of inputs and returns a string.
diff --git a/packages/core/src/PromptHelper.ts b/packages/core/src/PromptHelper.ts
index 8b497df9340b9ae73d1b889df012b16382682229..ff11819d509a1039a243e6d4479b382c8c4c4dd3 100644
--- a/packages/core/src/PromptHelper.ts
+++ b/packages/core/src/PromptHelper.ts
@@ -1,12 +1,12 @@
-import { globalsHelper } from "./GlobalsHelper";
-import { SimplePrompt } from "./Prompt";
-import { SentenceSplitter } from "./TextSplitter";
+import { globalsHelper } from "./GlobalsHelper.js";
+import { SimplePrompt } from "./Prompt.js";
+import { SentenceSplitter } from "./TextSplitter.js";
 import {
   DEFAULT_CHUNK_OVERLAP_RATIO,
   DEFAULT_CONTEXT_WINDOW,
   DEFAULT_NUM_OUTPUTS,
   DEFAULT_PADDING,
-} from "./constants";
+} from "./constants.js";
 
 export function getEmptyPromptTxt(prompt: SimplePrompt) {
   return prompt({});
diff --git a/packages/core/src/QuestionGenerator.ts b/packages/core/src/QuestionGenerator.ts
index 5dc1fa9ae34257bb661ba754d08f9bf289685f80..1d1053967dfb4a123275b59f3cb56ac9e519ccf6 100644
--- a/packages/core/src/QuestionGenerator.ts
+++ b/packages/core/src/QuestionGenerator.ts
@@ -1,14 +1,14 @@
-import { SubQuestionOutputParser } from "./OutputParser";
+import { SubQuestionOutputParser } from "./OutputParser.js";
 import {
   SubQuestionPrompt,
   buildToolsText,
   defaultSubQuestionPrompt,
-} from "./Prompt";
-import { BaseQuestionGenerator, SubQuestion } from "./engines/query/types";
-import { OpenAI } from "./llm/LLM";
-import { LLM } from "./llm/types";
-import { PromptMixin } from "./prompts";
-import { BaseOutputParser, StructuredOutput, ToolMetadata } from "./types";
+} from "./Prompt.js";
+import { BaseQuestionGenerator, SubQuestion } from "./engines/query/types.js";
+import { OpenAI } from "./llm/LLM.js";
+import { LLM } from "./llm/types.js";
+import { PromptMixin } from "./prompts/index.js";
+import { BaseOutputParser, StructuredOutput, ToolMetadata } from "./types.js";
 
 /**
  * LLMQuestionGenerator uses the LLM to generate new questions for the LLM using tools and a user query.
diff --git a/packages/core/src/Response.ts b/packages/core/src/Response.ts
index 5ae9514b77666000b306c7617d988b12dc7db88d..3f6b9b633f435a0033e7b3d33b892accbfb38fd9 100644
--- a/packages/core/src/Response.ts
+++ b/packages/core/src/Response.ts
@@ -1,4 +1,4 @@
-import { BaseNode } from "./Node";
+import { BaseNode } from "./Node.js";
 
 /**
  * Response is the output of a LLM
diff --git a/packages/core/src/Retriever.ts b/packages/core/src/Retriever.ts
index 6b0f1024db9e2c2ae146c1363ab8c5eff7477702..f5ed6c15d5c5166e4fd23875702711c7bb68f6ce 100644
--- a/packages/core/src/Retriever.ts
+++ b/packages/core/src/Retriever.ts
@@ -1,6 +1,6 @@
-import { Event } from "./callbacks/CallbackManager";
-import { NodeWithScore } from "./Node";
-import { ServiceContext } from "./ServiceContext";
+import { Event } from "./callbacks/CallbackManager.js";
+import { NodeWithScore } from "./Node.js";
+import { ServiceContext } from "./ServiceContext.js";
 
 /**
  * Retrievers retrieve the nodes that most closely match our query in similarity.
diff --git a/packages/core/src/ServiceContext.ts b/packages/core/src/ServiceContext.ts
index 7bdb2c66484d6e3ce55b5632346af4cf199cb1b9..ba72d2f363f730830fb57597affdb8ff814939d4 100644
--- a/packages/core/src/ServiceContext.ts
+++ b/packages/core/src/ServiceContext.ts
@@ -1,8 +1,10 @@
-import { CallbackManager } from "./callbacks/CallbackManager";
-import { BaseEmbedding, OpenAIEmbedding } from "./embeddings";
-import { LLM, OpenAI } from "./llm";
-import { NodeParser, SimpleNodeParser } from "./nodeParsers";
-import { PromptHelper } from "./PromptHelper";
+import { PromptHelper } from "./PromptHelper.js";
+import { CallbackManager } from "./callbacks/CallbackManager.js";
+import { OpenAIEmbedding } from "./embeddings/OpenAIEmbedding.js";
+import { BaseEmbedding } from "./embeddings/types.js";
+import { LLM, OpenAI } from "./llm/index.js";
+import { SimpleNodeParser } from "./nodeParsers/SimpleNodeParser.js";
+import { NodeParser } from "./nodeParsers/types.js";
 
 /**
  * The ServiceContext is a collection of components that are used in different parts of the application.
diff --git a/packages/core/src/TextSplitter.ts b/packages/core/src/TextSplitter.ts
index 94c7816762ce8f44afb57854d9eec6b3d3206a76..10b8dd5276f424751448eeca3519998adfc8c3b4 100644
--- a/packages/core/src/TextSplitter.ts
+++ b/packages/core/src/TextSplitter.ts
@@ -1,7 +1,7 @@
-import { EOL } from "./env";
+import { EOL } from "@llamaindex/env";
 // GitHub translated
-import { globalsHelper } from "./GlobalsHelper";
-import { DEFAULT_CHUNK_OVERLAP, DEFAULT_CHUNK_SIZE } from "./constants";
+import { globalsHelper } from "./GlobalsHelper.js";
+import { DEFAULT_CHUNK_OVERLAP, DEFAULT_CHUNK_SIZE } from "./constants.js";
 
 class TextSplit {
   textChunk: string;
diff --git a/packages/core/src/agent/index.ts b/packages/core/src/agent/index.ts
index 1ef9f464e53137db00a74a7dfcfaf359a6af8fad..bbf0a4481c4ae9aff71e0eafec80f15a0b40cb11 100644
--- a/packages/core/src/agent/index.ts
+++ b/packages/core/src/agent/index.ts
@@ -1,5 +1,5 @@
-export * from "./openai/base";
-export * from "./openai/worker";
-export * from "./react/base";
-export * from "./react/worker";
-export * from "./types";
+export * from "./openai/base.js";
+export * from "./openai/worker.js";
+export * from "./react/base.js";
+export * from "./react/worker.js";
+export * from "./types.js";
diff --git a/packages/core/src/agent/openai/base.ts b/packages/core/src/agent/openai/base.ts
index 6c5c15e6182127958e6457a697ac52ff9c0e1b77..a39a4fee725b65237e15e7230eb47c1845c33bcb 100644
--- a/packages/core/src/agent/openai/base.ts
+++ b/packages/core/src/agent/openai/base.ts
@@ -1,9 +1,9 @@
-import { CallbackManager } from "../../callbacks/CallbackManager";
-import { ChatMessage, OpenAI } from "../../llm";
-import { ObjectRetriever } from "../../objects/base";
-import { BaseTool } from "../../types";
-import { AgentRunner } from "../runner/base";
-import { OpenAIAgentWorker } from "./worker";
+import { CallbackManager } from "../../callbacks/CallbackManager.js";
+import { ChatMessage, OpenAI } from "../../llm/index.js";
+import { ObjectRetriever } from "../../objects/base.js";
+import { BaseTool } from "../../types.js";
+import { AgentRunner } from "../runner/base.js";
+import { OpenAIAgentWorker } from "./worker.js";
 
 type OpenAIAgentParams = {
   tools?: BaseTool[];
diff --git a/packages/core/src/agent/openai/utils.ts b/packages/core/src/agent/openai/utils.ts
index fb2094b0e55e0a6db0d11c7acbaefcf2fcc4d269..4dd913f5ba6dcd1f2e1ab3ed6f8022f3fad86f62 100644
--- a/packages/core/src/agent/openai/utils.ts
+++ b/packages/core/src/agent/openai/utils.ts
@@ -1,4 +1,4 @@
-import { ToolMetadata } from "../../types";
+import { ToolMetadata } from "../../types.js";
 
 export type OpenAIFunction = {
   type: "function";
diff --git a/packages/core/src/agent/openai/worker.ts b/packages/core/src/agent/openai/worker.ts
index 779a7c0142e112ac060a44eac9226fa220b97a07..401645ae7a218dbba9730f9b6288f7d6f70e3c80 100644
--- a/packages/core/src/agent/openai/worker.ts
+++ b/packages/core/src/agent/openai/worker.ts
@@ -1,23 +1,26 @@
 // Assuming that the necessary interfaces and classes (like BaseTool, OpenAI, ChatMessage, CallbackManager, etc.) are defined elsewhere
 
-import { CallbackManager } from "../../callbacks/CallbackManager";
-import { AgentChatResponse, ChatResponseMode } from "../../engines/chat";
-import { randomUUID } from "../../env";
+import { randomUUID } from "@llamaindex/env";
+import { CallbackManager } from "../../callbacks/CallbackManager.js";
+import {
+  AgentChatResponse,
+  ChatResponseMode,
+} from "../../engines/chat/types.js";
 import {
   ChatMessage,
   ChatResponse,
   ChatResponseChunk,
   OpenAI,
-} from "../../llm";
-import { ChatMemoryBuffer } from "../../memory/ChatMemoryBuffer";
-import { ObjectRetriever } from "../../objects/base";
-import { ToolOutput } from "../../tools/types";
-import { callToolWithErrorHandling } from "../../tools/utils";
-import { BaseTool } from "../../types";
-import { AgentWorker, Task, TaskStep, TaskStepOutput } from "../types";
-import { addUserStepToMemory, getFunctionByName } from "../utils";
-import { OpenAIToolCall } from "./types/chat";
-import { toOpenAiTool } from "./utils";
+} from "../../llm/index.js";
+import { ChatMemoryBuffer } from "../../memory/ChatMemoryBuffer.js";
+import { ObjectRetriever } from "../../objects/base.js";
+import { ToolOutput } from "../../tools/types.js";
+import { callToolWithErrorHandling } from "../../tools/utils.js";
+import { BaseTool } from "../../types.js";
+import { AgentWorker, Task, TaskStep, TaskStepOutput } from "../types.js";
+import { addUserStepToMemory, getFunctionByName } from "../utils.js";
+import { OpenAIToolCall } from "./types/chat.js";
+import { toOpenAiTool } from "./utils.js";
 
 const DEFAULT_MAX_FUNCTION_CALLS = 5;
 
diff --git a/packages/core/src/agent/react/base.ts b/packages/core/src/agent/react/base.ts
index e0883e4bbe027a06e6650cfe9d029ceade8076cf..fa97c30110f4f25217eaed5763eac4fce5a28a37 100644
--- a/packages/core/src/agent/react/base.ts
+++ b/packages/core/src/agent/react/base.ts
@@ -1,9 +1,9 @@
-import { CallbackManager } from "../../callbacks/CallbackManager";
-import { ChatMessage, LLM } from "../../llm";
-import { ObjectRetriever } from "../../objects/base";
-import { BaseTool } from "../../types";
-import { AgentRunner } from "../runner/base";
-import { ReActAgentWorker } from "./worker";
+import { CallbackManager } from "../../callbacks/CallbackManager.js";
+import { ChatMessage, LLM } from "../../llm/index.js";
+import { ObjectRetriever } from "../../objects/base.js";
+import { BaseTool } from "../../types.js";
+import { AgentRunner } from "../runner/base.js";
+import { ReActAgentWorker } from "./worker.js";
 
 type ReActAgentParams = {
   tools: BaseTool[];
diff --git a/packages/core/src/agent/react/formatter.ts b/packages/core/src/agent/react/formatter.ts
index bcf25aa052889eabd0de022377056a23a234bcb3..ce2744390d6a233dc3755d63435b08b0bad9498d 100644
--- a/packages/core/src/agent/react/formatter.ts
+++ b/packages/core/src/agent/react/formatter.ts
@@ -1,7 +1,7 @@
-import { ChatMessage } from "../../llm";
-import { BaseTool } from "../../types";
-import { getReactChatSystemHeader } from "./prompts";
-import { BaseReasoningStep, ObservationReasoningStep } from "./types";
+import { ChatMessage } from "../../llm/index.js";
+import { BaseTool } from "../../types.js";
+import { getReactChatSystemHeader } from "./prompts.js";
+import { BaseReasoningStep, ObservationReasoningStep } from "./types.js";
 
 function getReactToolDescriptions(tools: BaseTool[]): string[] {
   const toolDescs: string[] = [];
diff --git a/packages/core/src/agent/react/outputParser.ts b/packages/core/src/agent/react/outputParser.ts
index 3ed1d7be3c9edeb76c241beb443b7dac6378d1de..d1c1d573f6b5858f1d341179b9b1eb753d3bef00 100644
--- a/packages/core/src/agent/react/outputParser.ts
+++ b/packages/core/src/agent/react/outputParser.ts
@@ -3,7 +3,7 @@ import {
   BaseOutputParser,
   BaseReasoningStep,
   ResponseReasoningStep,
-} from "./types";
+} from "./types.js";
 
 function extractJsonStr(text: string): string {
   const pattern = /\{.*\}/s;
diff --git a/packages/core/src/agent/react/types.ts b/packages/core/src/agent/react/types.ts
index 04e7889e2bebda15a1d33ad831e9fb309ba7d068..660bc1c7906b909321bae72b465932c2ba752b4b 100644
--- a/packages/core/src/agent/react/types.ts
+++ b/packages/core/src/agent/react/types.ts
@@ -1,4 +1,4 @@
-import { ChatMessage } from "../../llm";
+import { ChatMessage } from "../../llm/index.js";
 
 export interface BaseReasoningStep {
   getContent(): string;
diff --git a/packages/core/src/agent/react/worker.ts b/packages/core/src/agent/react/worker.ts
index 1bb48691a8c5fbb4ee46fbd5dbe7c5fbac126a7e..1af501792fc24788374220f8facfdc1b2c43124a 100644
--- a/packages/core/src/agent/react/worker.ts
+++ b/packages/core/src/agent/react/worker.ts
@@ -1,20 +1,20 @@
 import { randomUUID } from "crypto";
-import { CallbackManager } from "../../callbacks/CallbackManager";
-import { AgentChatResponse } from "../../engines/chat";
-import { ChatResponse, LLM, OpenAI } from "../../llm";
-import { ChatMemoryBuffer } from "../../memory/ChatMemoryBuffer";
-import { ObjectRetriever } from "../../objects/base";
-import { ToolOutput } from "../../tools";
-import { BaseTool } from "../../types";
-import { AgentWorker, Task, TaskStep, TaskStepOutput } from "../types";
-import { ReActChatFormatter } from "./formatter";
-import { ReActOutputParser } from "./outputParser";
+import { CallbackManager } from "../../callbacks/CallbackManager.js";
+import { AgentChatResponse } from "../../engines/chat/index.js";
+import { ChatResponse, LLM, OpenAI } from "../../llm/index.js";
+import { ChatMemoryBuffer } from "../../memory/ChatMemoryBuffer.js";
+import { ObjectRetriever } from "../../objects/base.js";
+import { ToolOutput } from "../../tools/index.js";
+import { BaseTool } from "../../types.js";
+import { AgentWorker, Task, TaskStep, TaskStepOutput } from "../types.js";
+import { ReActChatFormatter } from "./formatter.js";
+import { ReActOutputParser } from "./outputParser.js";
 import {
   ActionReasoningStep,
   BaseReasoningStep,
   ObservationReasoningStep,
   ResponseReasoningStep,
-} from "./types";
+} from "./types.js";
 
 type ReActAgentWorkerParams = {
   tools: BaseTool[];
diff --git a/packages/core/src/agent/runner/base.ts b/packages/core/src/agent/runner/base.ts
index 5183f16f98015fe6c1a77aa6eb5bafcc87729922..5a0764895c8a43bab78877b19c935f7c6ef6d780 100644
--- a/packages/core/src/agent/runner/base.ts
+++ b/packages/core/src/agent/runner/base.ts
@@ -1,15 +1,15 @@
 import { randomUUID } from "crypto";
-import { CallbackManager } from "../../callbacks/CallbackManager";
+import { CallbackManager } from "../../callbacks/CallbackManager.js";
 import {
   AgentChatResponse,
   ChatEngineAgentParams,
   ChatResponseMode,
-} from "../../engines/chat";
-import { ChatMessage, LLM } from "../../llm";
-import { ChatMemoryBuffer } from "../../memory/ChatMemoryBuffer";
-import { BaseMemory } from "../../memory/types";
-import { AgentWorker, Task, TaskStep, TaskStepOutput } from "../types";
-import { AgentState, BaseAgentRunner, TaskState } from "./types";
+} from "../../engines/chat/index.js";
+import { ChatMessage, LLM } from "../../llm/index.js";
+import { ChatMemoryBuffer } from "../../memory/ChatMemoryBuffer.js";
+import { BaseMemory } from "../../memory/types.js";
+import { AgentWorker, Task, TaskStep, TaskStepOutput } from "../types.js";
+import { AgentState, BaseAgentRunner, TaskState } from "./types.js";
 
 const validateStepFromArgs = (
   taskId: string,
diff --git a/packages/core/src/agent/runner/types.ts b/packages/core/src/agent/runner/types.ts
index b4e7a2236a05e2bd486b2c2404a9aeb285138831..3def71e6ab07b1226f59f068846e0ae3b241fb7f 100644
--- a/packages/core/src/agent/runner/types.ts
+++ b/packages/core/src/agent/runner/types.ts
@@ -1,5 +1,5 @@
-import { AgentChatResponse } from "../../engines/chat";
-import { BaseAgent, Task, TaskStep, TaskStepOutput } from "../types";
+import { AgentChatResponse } from "../../engines/chat/index.js";
+import { BaseAgent, Task, TaskStep, TaskStepOutput } from "../types.js";
 
 export class TaskState {
   task!: Task;
diff --git a/packages/core/src/agent/types.ts b/packages/core/src/agent/types.ts
index e862825f583acaf96e3b46036d1395ab48796b51..e82060c2e67b6b1198fbfb7d0980aac4d8270162 100644
--- a/packages/core/src/agent/types.ts
+++ b/packages/core/src/agent/types.ts
@@ -1,5 +1,8 @@
-import { AgentChatResponse, ChatEngineAgentParams } from "../engines/chat";
-import { QueryEngineParamsNonStreaming } from "../types";
+import {
+  AgentChatResponse,
+  ChatEngineAgentParams,
+} from "../engines/chat/index.js";
+import { QueryEngineParamsNonStreaming } from "../types.js";
 
 export interface AgentWorker {
   initializeStep(task: Task, kwargs?: any): TaskStep;
diff --git a/packages/core/src/agent/utils.ts b/packages/core/src/agent/utils.ts
index 4d6aa8098d884315030c15558f6adb2f138d34cf..d1953bf47ff696dbe118848b75f73846af893243 100644
--- a/packages/core/src/agent/utils.ts
+++ b/packages/core/src/agent/utils.ts
@@ -1,7 +1,7 @@
-import { ChatMessage } from "../llm";
-import { ChatMemoryBuffer } from "../memory/ChatMemoryBuffer";
-import { BaseTool } from "../types";
-import { TaskStep } from "./types";
+import { ChatMessage } from "../llm/index.js";
+import { ChatMemoryBuffer } from "../memory/ChatMemoryBuffer.js";
+import { BaseTool } from "../types.js";
+import { TaskStep } from "./types.js";
 
 /**
  * Adds the user's input to the memory.
diff --git a/packages/core/src/callbacks/CallbackManager.ts b/packages/core/src/callbacks/CallbackManager.ts
index 43e314e893d40be5079975e918d830620f784d51..038707bf0d66711de54cbfa9fa27b7e900c3d075 100644
--- a/packages/core/src/callbacks/CallbackManager.ts
+++ b/packages/core/src/callbacks/CallbackManager.ts
@@ -1,5 +1,5 @@
 import type { Anthropic } from "@anthropic-ai/sdk";
-import { NodeWithScore } from "../Node";
+import { NodeWithScore } from "../Node.js";
 
 /*
   An event is a wrapper that groups related operations.
diff --git a/packages/core/src/cloud/LlamaCloudIndex.ts b/packages/core/src/cloud/LlamaCloudIndex.ts
index 0daa76c8d19d268ef42c662f7577dbca8d66cf03..ff433c157a67aaf4e89d6ddb5cc5ea6df46f04f5 100644
--- a/packages/core/src/cloud/LlamaCloudIndex.ts
+++ b/packages/core/src/cloud/LlamaCloudIndex.ts
@@ -1,10 +1,10 @@
-import { BaseRetriever } from "../Retriever";
-import { RetrieverQueryEngine } from "../engines/query/RetrieverQueryEngine";
-import { BaseNodePostprocessor } from "../postprocessors";
-import { BaseSynthesizer } from "../synthesizers";
-import { BaseQueryEngine } from "../types";
-import { LlamaCloudRetriever, RetrieveParams } from "./LlamaCloudRetriever";
-import { CloudConstructorParams } from "./types";
+import { BaseRetriever } from "../Retriever.js";
+import { RetrieverQueryEngine } from "../engines/query/RetrieverQueryEngine.js";
+import { BaseNodePostprocessor } from "../postprocessors/types.js";
+import { BaseSynthesizer } from "../synthesizers/types.js";
+import { BaseQueryEngine } from "../types.js";
+import { LlamaCloudRetriever, RetrieveParams } from "./LlamaCloudRetriever.js";
+import { CloudConstructorParams } from "./types.js";
 
 export class LlamaCloudIndex {
   params: CloudConstructorParams;
diff --git a/packages/core/src/cloud/LlamaCloudRetriever.ts b/packages/core/src/cloud/LlamaCloudRetriever.ts
index 9773831342a4416f68657636c14084d1f06cf33a..c3e3613f9e0671a4ecf7055c50d749da46a1a1c2 100644
--- a/packages/core/src/cloud/LlamaCloudRetriever.ts
+++ b/packages/core/src/cloud/LlamaCloudRetriever.ts
@@ -1,15 +1,18 @@
 import { PlatformApi, PlatformApiClient } from "@llamaindex/cloud";
-import { globalsHelper } from "../GlobalsHelper";
-import { NodeWithScore, ObjectType, jsonToNode } from "../Node";
-import { BaseRetriever } from "../Retriever";
-import { ServiceContext, serviceContextFromDefaults } from "../ServiceContext";
-import { Event } from "../callbacks/CallbackManager";
+import { globalsHelper } from "../GlobalsHelper.js";
+import { NodeWithScore, ObjectType, jsonToNode } from "../Node.js";
+import { BaseRetriever } from "../Retriever.js";
+import {
+  ServiceContext,
+  serviceContextFromDefaults,
+} from "../ServiceContext.js";
+import { Event } from "../callbacks/CallbackManager.js";
 import {
   ClientParams,
   CloudConstructorParams,
   DEFAULT_PROJECT_NAME,
-} from "./types";
-import { getClient } from "./utils";
+} from "./types.js";
+import { getClient } from "./utils.js";
 
 export type RetrieveParams = Omit<
   PlatformApi.RetrievalParams,
diff --git a/packages/core/src/cloud/index.ts b/packages/core/src/cloud/index.ts
index 629b2e2ace2f96205a6242f59a029b975fa2d9ac..15558abb0db5a5ee9b7a4590dec79e3d413d9099 100644
--- a/packages/core/src/cloud/index.ts
+++ b/packages/core/src/cloud/index.ts
@@ -1,2 +1,2 @@
-export * from "./LlamaCloudIndex";
-export * from "./LlamaCloudRetriever";
+export * from "./LlamaCloudIndex.js";
+export * from "./LlamaCloudRetriever.js";
diff --git a/packages/core/src/cloud/types.ts b/packages/core/src/cloud/types.ts
index de74bc2edb14520cc2ee261c5e5cfae4769d0fb5..3fc118344130f33ae9ed80b8a60849e60e4fd9b6 100644
--- a/packages/core/src/cloud/types.ts
+++ b/packages/core/src/cloud/types.ts
@@ -1,4 +1,4 @@
-import { ServiceContext } from "../ServiceContext";
+import { ServiceContext } from "../ServiceContext.js";
 
 export const DEFAULT_PROJECT_NAME = "default";
 export const DEFAULT_BASE_URL = "https://api.cloud.llamaindex.ai";
diff --git a/packages/core/src/cloud/utils.ts b/packages/core/src/cloud/utils.ts
index 9aaaab805c4020cd2837e658e5a49de74c46c17b..e6a7a1dc5430b4c36f84d69e26e8996be717f1b9 100644
--- a/packages/core/src/cloud/utils.ts
+++ b/packages/core/src/cloud/utils.ts
@@ -1,5 +1,5 @@
 import { PlatformApiClient } from "@llamaindex/cloud";
-import { ClientParams, DEFAULT_BASE_URL } from "./types";
+import { ClientParams, DEFAULT_BASE_URL } from "./types.js";
 
 export async function getClient({
   apiKey,
diff --git a/packages/core/src/embeddings/ClipEmbedding.ts b/packages/core/src/embeddings/ClipEmbedding.ts
index d97dad94459346a2e84c8af7229007a2379a474a..6658342cf76af8affe1d0bdd36b9fec5e6504b4b 100644
--- a/packages/core/src/embeddings/ClipEmbedding.ts
+++ b/packages/core/src/embeddings/ClipEmbedding.ts
@@ -1,6 +1,6 @@
-import { ImageType } from "../Node";
-import { MultiModalEmbedding } from "./MultiModalEmbedding";
-import { readImage } from "./utils";
+import { ImageType } from "../Node.js";
+import { MultiModalEmbedding } from "./MultiModalEmbedding.js";
+import { readImage } from "./utils.js";
 
 export enum ClipEmbeddingModelType {
   XENOVA_CLIP_VIT_BASE_PATCH32 = "Xenova/clip-vit-base-patch32",
diff --git a/packages/core/src/embeddings/HuggingFaceEmbedding.ts b/packages/core/src/embeddings/HuggingFaceEmbedding.ts
index 810bc14fbcedb66b0b039704534f417bfa531884..91b6514e9b2c9763050e575f83fa7b2c6ca38da4 100644
--- a/packages/core/src/embeddings/HuggingFaceEmbedding.ts
+++ b/packages/core/src/embeddings/HuggingFaceEmbedding.ts
@@ -1,4 +1,4 @@
-import { BaseEmbedding } from "./types";
+import { BaseEmbedding } from "./types.js";
 
 export enum HuggingFaceEmbeddingModelType {
   XENOVA_ALL_MINILM_L6_V2 = "Xenova/all-MiniLM-L6-v2",
diff --git a/packages/core/src/embeddings/MistralAIEmbedding.ts b/packages/core/src/embeddings/MistralAIEmbedding.ts
index 8ade99282abf8fc61ec50054e6230fd2f8920a50..fdef08085ea2b6ccc50c7ae73771a0fb2a5f002b 100644
--- a/packages/core/src/embeddings/MistralAIEmbedding.ts
+++ b/packages/core/src/embeddings/MistralAIEmbedding.ts
@@ -1,5 +1,5 @@
-import { MistralAISession } from "../llm/mistral";
-import { BaseEmbedding } from "./types";
+import { MistralAISession } from "../llm/mistral.js";
+import { BaseEmbedding } from "./types.js";
 
 export enum MistralAIEmbeddingModelType {
   MISTRAL_EMBED = "mistral-embed",
diff --git a/packages/core/src/embeddings/MultiModalEmbedding.ts b/packages/core/src/embeddings/MultiModalEmbedding.ts
index 46d68ec25948db03c0137c35094acb72f6af557d..df1958f6b15269c58ab84f667a3817e3a2a26602 100644
--- a/packages/core/src/embeddings/MultiModalEmbedding.ts
+++ b/packages/core/src/embeddings/MultiModalEmbedding.ts
@@ -1,5 +1,5 @@
-import { ImageType } from "../Node";
-import { BaseEmbedding } from "./types";
+import { ImageType } from "../Node.js";
+import { BaseEmbedding } from "./types.js";
 
 /*
  * Base class for Multi Modal embeddings.
diff --git a/packages/core/src/embeddings/OllamaEmbedding.ts b/packages/core/src/embeddings/OllamaEmbedding.ts
index 896282c5884dac955019d0536a5fc4ae867cb71f..a6c326ef61a9e6b5c9ec870232316a1a221836e4 100644
--- a/packages/core/src/embeddings/OllamaEmbedding.ts
+++ b/packages/core/src/embeddings/OllamaEmbedding.ts
@@ -1,5 +1,5 @@
-import { Ollama } from "../llm/ollama";
-import { BaseEmbedding } from "./types";
+import { Ollama } from "../llm/ollama.js";
+import { BaseEmbedding } from "./types.js";
 
 /**
  * OllamaEmbedding is an alias for Ollama that implements the BaseEmbedding interface.
diff --git a/packages/core/src/embeddings/OpenAIEmbedding.ts b/packages/core/src/embeddings/OpenAIEmbedding.ts
index 321c3da0c93aeeeb08226c52b5794660b4fa545d..5402111f9ba15df9112b558a0dec38aa138b168c 100644
--- a/packages/core/src/embeddings/OpenAIEmbedding.ts
+++ b/packages/core/src/embeddings/OpenAIEmbedding.ts
@@ -5,9 +5,9 @@ import {
   getAzureConfigFromEnv,
   getAzureModel,
   shouldUseAzure,
-} from "../llm/azure";
-import { OpenAISession, getOpenAISession } from "../llm/open_ai";
-import { BaseEmbedding } from "./types";
+} from "../llm/azure.js";
+import { OpenAISession, getOpenAISession } from "../llm/open_ai.js";
+import { BaseEmbedding } from "./types.js";
 
 export const ALL_OPENAI_EMBEDDING_MODELS = {
   "text-embedding-ada-002": {
diff --git a/packages/core/src/embeddings/fireworks.ts b/packages/core/src/embeddings/fireworks.ts
index a2abfa1313b5ecf29abc8cc2268b669827f2f3de..651e3919b1e7b2dbef28ede8d6f15f6002b0d0f8 100644
--- a/packages/core/src/embeddings/fireworks.ts
+++ b/packages/core/src/embeddings/fireworks.ts
@@ -1,4 +1,4 @@
-import { OpenAIEmbedding } from "./OpenAIEmbedding";
+import { OpenAIEmbedding } from "./OpenAIEmbedding.js";
 
 export class FireworksEmbedding extends OpenAIEmbedding {
   constructor(init?: Partial<OpenAIEmbedding>) {
diff --git a/packages/core/src/embeddings/index.ts b/packages/core/src/embeddings/index.ts
index 4660233c0897c78bb8676c167cc761a1237127f6..005f1aaa3183015e6e02bcecdba32303996decc7 100644
--- a/packages/core/src/embeddings/index.ts
+++ b/packages/core/src/embeddings/index.ts
@@ -1,10 +1,10 @@
-export * from "./ClipEmbedding";
-export * from "./HuggingFaceEmbedding";
-export * from "./MistralAIEmbedding";
-export * from "./MultiModalEmbedding";
-export { OllamaEmbedding } from "./OllamaEmbedding";
-export * from "./OpenAIEmbedding";
-export { FireworksEmbedding } from "./fireworks";
-export { TogetherEmbedding } from "./together";
-export * from "./types";
-export * from "./utils";
+export * from "./ClipEmbedding.js";
+export * from "./HuggingFaceEmbedding.js";
+export * from "./MistralAIEmbedding.js";
+export * from "./MultiModalEmbedding.js";
+export { OllamaEmbedding } from "./OllamaEmbedding.js";
+export * from "./OpenAIEmbedding.js";
+export { FireworksEmbedding } from "./fireworks.js";
+export { TogetherEmbedding } from "./together.js";
+export * from "./types.js";
+export * from "./utils.js";
diff --git a/packages/core/src/embeddings/together.ts b/packages/core/src/embeddings/together.ts
index d271a67333dd7655a8e943987f8f557168c50165..4c2ca91c671a3a1325667004882b81e0ee0fc544 100644
--- a/packages/core/src/embeddings/together.ts
+++ b/packages/core/src/embeddings/together.ts
@@ -1,4 +1,4 @@
-import { OpenAIEmbedding } from "./OpenAIEmbedding";
+import { OpenAIEmbedding } from "./OpenAIEmbedding.js";
 
 export class TogetherEmbedding extends OpenAIEmbedding {
   constructor(init?: Partial<OpenAIEmbedding>) {
diff --git a/packages/core/src/embeddings/types.ts b/packages/core/src/embeddings/types.ts
index 1058e3ead02758c2289820349b52f1c35a921d7f..c365dfa1cb958e45b9dad4bb3777b36068026373 100644
--- a/packages/core/src/embeddings/types.ts
+++ b/packages/core/src/embeddings/types.ts
@@ -1,6 +1,6 @@
-import { BaseNode, MetadataMode } from "../Node";
-import { TransformComponent } from "../ingestion";
-import { SimilarityType, similarity } from "./utils";
+import { BaseNode, MetadataMode } from "../Node.js";
+import { TransformComponent } from "../ingestion/types.js";
+import { SimilarityType, similarity } from "./utils.js";
 
 const DEFAULT_EMBED_BATCH_SIZE = 10;
 
diff --git a/packages/core/src/embeddings/utils.ts b/packages/core/src/embeddings/utils.ts
index ce1848e8716d59cc17489dd4fd927f6a31bc3d87..d69b5c3c160e32a3bc76404f3dbe38e4db72e843 100644
--- a/packages/core/src/embeddings/utils.ts
+++ b/packages/core/src/embeddings/utils.ts
@@ -1,8 +1,8 @@
+import { defaultFS } from "@llamaindex/env";
 import _ from "lodash";
-import { ImageType } from "../Node";
-import { DEFAULT_SIMILARITY_TOP_K } from "../constants";
-import { defaultFS } from "../env";
-import { VectorStoreQueryMode } from "../storage/vectorStore/types";
+import { ImageType } from "../Node.js";
+import { DEFAULT_SIMILARITY_TOP_K } from "../constants.js";
+import { VectorStoreQueryMode } from "../storage/vectorStore/types.js";
 
 /**
  * Similarity type
diff --git a/packages/core/src/engines/chat/CondenseQuestionChatEngine.ts b/packages/core/src/engines/chat/CondenseQuestionChatEngine.ts
index 0c73a1017f3b6fb9ddd69c78fe1f60b5faca06d9..22524203df891043da253c424f79e3171201e3c5 100644
--- a/packages/core/src/engines/chat/CondenseQuestionChatEngine.ts
+++ b/packages/core/src/engines/chat/CondenseQuestionChatEngine.ts
@@ -1,23 +1,23 @@
-import { ChatHistory, getHistory } from "../../ChatHistory";
+import { ChatHistory, getHistory } from "../../ChatHistory.js";
 import {
   CondenseQuestionPrompt,
   defaultCondenseQuestionPrompt,
   messagesToHistoryStr,
-} from "../../Prompt";
-import { Response } from "../../Response";
+} from "../../Prompt.js";
+import { Response } from "../../Response.js";
 import {
   ServiceContext,
   serviceContextFromDefaults,
-} from "../../ServiceContext";
-import { ChatMessage, LLM } from "../../llm";
-import { extractText, streamReducer } from "../../llm/utils";
-import { PromptMixin } from "../../prompts";
-import { BaseQueryEngine } from "../../types";
+} from "../../ServiceContext.js";
+import { ChatMessage, LLM } from "../../llm/index.js";
+import { extractText, streamReducer } from "../../llm/utils.js";
+import { PromptMixin } from "../../prompts/index.js";
+import { BaseQueryEngine } from "../../types.js";
 import {
   ChatEngine,
   ChatEngineParamsNonStreaming,
   ChatEngineParamsStreaming,
-} from "./types";
+} from "./types.js";
 
 /**
  * CondenseQuestionChatEngine is used in conjunction with a Index (for example VectorStoreIndex).
diff --git a/packages/core/src/engines/chat/ContextChatEngine.ts b/packages/core/src/engines/chat/ContextChatEngine.ts
index c56ce0c50e35db7974ed8e2b47f0b3b55e4961e1..7d63c74d049f62ca5a09610dc636189e326df0a2 100644
--- a/packages/core/src/engines/chat/ContextChatEngine.ts
+++ b/packages/core/src/engines/chat/ContextChatEngine.ts
@@ -1,21 +1,30 @@
-import { ChatHistory, getHistory } from "../../ChatHistory";
-import { ContextSystemPrompt } from "../../Prompt";
-import { Response } from "../../Response";
-import { BaseRetriever } from "../../Retriever";
-import { Event } from "../../callbacks/CallbackManager";
-import { randomUUID } from "../../env";
-import { ChatMessage, ChatResponseChunk, LLM, OpenAI } from "../../llm";
-import { MessageContent } from "../../llm/types";
-import { extractText, streamConverter, streamReducer } from "../../llm/utils";
-import { BaseNodePostprocessor } from "../../postprocessors";
-import { PromptMixin } from "../../prompts";
-import { DefaultContextGenerator } from "./DefaultContextGenerator";
+import { randomUUID } from "@llamaindex/env";
+import { ChatHistory, getHistory } from "../../ChatHistory.js";
+import { ContextSystemPrompt } from "../../Prompt.js";
+import { Response } from "../../Response.js";
+import { BaseRetriever } from "../../Retriever.js";
+import { Event } from "../../callbacks/CallbackManager.js";
+import {
+  ChatMessage,
+  ChatResponseChunk,
+  LLM,
+  OpenAI,
+} from "../../llm/index.js";
+import { MessageContent } from "../../llm/types.js";
+import {
+  extractText,
+  streamConverter,
+  streamReducer,
+} from "../../llm/utils.js";
+import { BaseNodePostprocessor } from "../../postprocessors/index.js";
+import { PromptMixin } from "../../prompts/Mixin.js";
+import { DefaultContextGenerator } from "./DefaultContextGenerator.js";
 import {
   ChatEngine,
   ChatEngineParamsNonStreaming,
   ChatEngineParamsStreaming,
   ContextGenerator,
-} from "./types";
+} from "./types.js";
 
 /**
  * ContextChatEngine uses the Index to get the appropriate context for each query.
diff --git a/packages/core/src/engines/chat/DefaultContextGenerator.ts b/packages/core/src/engines/chat/DefaultContextGenerator.ts
index 4b359ac0fea4de9a4c48e8284ecaab9fdbae0881..4c96c744c14ed7ec53a10b2cb1d427c6d601ccf1 100644
--- a/packages/core/src/engines/chat/DefaultContextGenerator.ts
+++ b/packages/core/src/engines/chat/DefaultContextGenerator.ts
@@ -1,11 +1,14 @@
-import { NodeWithScore, TextNode } from "../../Node";
-import { ContextSystemPrompt, defaultContextSystemPrompt } from "../../Prompt";
-import { BaseRetriever } from "../../Retriever";
-import { Event } from "../../callbacks/CallbackManager";
-import { randomUUID } from "../../env";
-import { BaseNodePostprocessor } from "../../postprocessors";
-import { PromptMixin } from "../../prompts";
-import { Context, ContextGenerator } from "./types";
+import { randomUUID } from "@llamaindex/env";
+import { NodeWithScore, TextNode } from "../../Node.js";
+import {
+  ContextSystemPrompt,
+  defaultContextSystemPrompt,
+} from "../../Prompt.js";
+import { BaseRetriever } from "../../Retriever.js";
+import { Event } from "../../callbacks/CallbackManager.js";
+import { BaseNodePostprocessor } from "../../postprocessors/index.js";
+import { PromptMixin } from "../../prompts/index.js";
+import { Context, ContextGenerator } from "./types.js";
 
 export class DefaultContextGenerator
   extends PromptMixin
diff --git a/packages/core/src/engines/chat/SimpleChatEngine.ts b/packages/core/src/engines/chat/SimpleChatEngine.ts
index 370e32cfe91d0ad851d431aebcc0e696c4ce1653..16617331b22027a682f65f15e76eaf7b8c0c2765 100644
--- a/packages/core/src/engines/chat/SimpleChatEngine.ts
+++ b/packages/core/src/engines/chat/SimpleChatEngine.ts
@@ -1,12 +1,12 @@
-import { ChatHistory, getHistory } from "../../ChatHistory";
-import { Response } from "../../Response";
-import { ChatResponseChunk, LLM, OpenAI } from "../../llm";
-import { streamConverter, streamReducer } from "../../llm/utils";
+import { ChatHistory, getHistory } from "../../ChatHistory.js";
+import { Response } from "../../Response.js";
+import { ChatResponseChunk, LLM, OpenAI } from "../../llm/index.js";
+import { streamConverter, streamReducer } from "../../llm/utils.js";
 import {
   ChatEngine,
   ChatEngineParamsNonStreaming,
   ChatEngineParamsStreaming,
-} from "./types";
+} from "./types.js";
 
 /**
  * SimpleChatEngine is the simplest possible chat engine. Useful for using your own custom prompts.
diff --git a/packages/core/src/engines/chat/index.ts b/packages/core/src/engines/chat/index.ts
index 3049bfa5780b8da2e6981098037bb8a3ae655a2d..c66c20fbf7ddd46ac904a887dc186effc03eb790 100644
--- a/packages/core/src/engines/chat/index.ts
+++ b/packages/core/src/engines/chat/index.ts
@@ -1,4 +1,4 @@
-export { CondenseQuestionChatEngine } from "./CondenseQuestionChatEngine";
-export { ContextChatEngine } from "./ContextChatEngine";
-export { SimpleChatEngine } from "./SimpleChatEngine";
-export * from "./types";
+export { CondenseQuestionChatEngine } from "./CondenseQuestionChatEngine.js";
+export { ContextChatEngine } from "./ContextChatEngine.js";
+export { SimpleChatEngine } from "./SimpleChatEngine.js";
+export * from "./types.js";
diff --git a/packages/core/src/engines/chat/types.ts b/packages/core/src/engines/chat/types.ts
index f11329110e411327526ad51f209f4b5217689f1a..80140fb45dd0df0ed61cd09f40aeea6df3a7b58c 100644
--- a/packages/core/src/engines/chat/types.ts
+++ b/packages/core/src/engines/chat/types.ts
@@ -1,10 +1,10 @@
-import { ChatHistory } from "../../ChatHistory";
-import { BaseNode, NodeWithScore } from "../../Node";
-import { Response } from "../../Response";
-import { Event } from "../../callbacks/CallbackManager";
-import { ChatMessage } from "../../llm";
-import { MessageContent } from "../../llm/types";
-import { ToolOutput } from "../../tools/types";
+import { ChatHistory } from "../../ChatHistory.js";
+import { BaseNode, NodeWithScore } from "../../Node.js";
+import { Response } from "../../Response.js";
+import { Event } from "../../callbacks/CallbackManager.js";
+import { ChatMessage } from "../../llm/index.js";
+import { MessageContent } from "../../llm/types.js";
+import { ToolOutput } from "../../tools/types.js";
 
 /**
  * Represents the base parameters for ChatEngine.
diff --git a/packages/core/src/engines/query/RetrieverQueryEngine.ts b/packages/core/src/engines/query/RetrieverQueryEngine.ts
index 94c5b86c452c8f483d0cdd3d8d3583c3ac732da6..cc6fa25911bc8346cfe8ab76e31b2f068c0a5f89 100644
--- a/packages/core/src/engines/query/RetrieverQueryEngine.ts
+++ b/packages/core/src/engines/query/RetrieverQueryEngine.ts
@@ -1,17 +1,20 @@
-import { NodeWithScore } from "../../Node";
-import { Response } from "../../Response";
-import { BaseRetriever } from "../../Retriever";
-import { ServiceContext } from "../../ServiceContext";
-import { Event } from "../../callbacks/CallbackManager";
-import { randomUUID } from "../../env";
-import { BaseNodePostprocessor } from "../../postprocessors";
-import { PromptMixin } from "../../prompts";
-import { BaseSynthesizer, ResponseSynthesizer } from "../../synthesizers";
+import { randomUUID } from "@llamaindex/env";
+import { NodeWithScore } from "../../Node.js";
+import { Response } from "../../Response.js";
+import { BaseRetriever } from "../../Retriever.js";
+import { ServiceContext } from "../../ServiceContext.js";
+import { Event } from "../../callbacks/CallbackManager.js";
+import { BaseNodePostprocessor } from "../../postprocessors/index.js";
+import { PromptMixin } from "../../prompts/Mixin.js";
+import {
+  BaseSynthesizer,
+  ResponseSynthesizer,
+} from "../../synthesizers/index.js";
 import {
   BaseQueryEngine,
   QueryEngineParamsNonStreaming,
   QueryEngineParamsStreaming,
-} from "../../types";
+} from "../../types.js";
 
 /**
  * A query engine that uses a retriever to query an index and then synthesizes the response.
diff --git a/packages/core/src/engines/query/RouterQueryEngine.ts b/packages/core/src/engines/query/RouterQueryEngine.ts
index d48a23cf4cc0bbe7fe32a46334b5732c69f9bdf7..7fa54accdf1a7b7ed447a82281a95ba6daa20909 100644
--- a/packages/core/src/engines/query/RouterQueryEngine.ts
+++ b/packages/core/src/engines/query/RouterQueryEngine.ts
@@ -1,18 +1,18 @@
-import { BaseNode } from "../../Node";
-import { Response } from "../../Response";
+import { BaseNode } from "../../Node.js";
+import { Response } from "../../Response.js";
 import {
   ServiceContext,
   serviceContextFromDefaults,
-} from "../../ServiceContext";
-import { PromptMixin } from "../../prompts";
-import { BaseSelector, LLMSingleSelector } from "../../selectors";
-import { TreeSummarize } from "../../synthesizers";
+} from "../../ServiceContext.js";
+import { PromptMixin } from "../../prompts/index.js";
+import { BaseSelector, LLMSingleSelector } from "../../selectors/index.js";
+import { TreeSummarize } from "../../synthesizers/index.js";
 import {
   BaseQueryEngine,
   QueryBundle,
   QueryEngineParamsNonStreaming,
   QueryEngineParamsStreaming,
-} from "../../types";
+} from "../../types.js";
 
 type RouterQueryEngineTool = {
   queryEngine: BaseQueryEngine;
diff --git a/packages/core/src/engines/query/SubQuestionQueryEngine.ts b/packages/core/src/engines/query/SubQuestionQueryEngine.ts
index 0139ecd0a255ad240b24f31b4c55bdf60c98be48..6e60a1dbf6159ca278d4f0bef1ff8351ab1df974 100644
--- a/packages/core/src/engines/query/SubQuestionQueryEngine.ts
+++ b/packages/core/src/engines/query/SubQuestionQueryEngine.ts
@@ -1,18 +1,18 @@
-import { NodeWithScore, TextNode } from "../../Node";
-import { LLMQuestionGenerator } from "../../QuestionGenerator";
-import { Response } from "../../Response";
+import { randomUUID } from "@llamaindex/env";
+import { NodeWithScore, TextNode } from "../../Node.js";
+import { LLMQuestionGenerator } from "../../QuestionGenerator.js";
+import { Response } from "../../Response.js";
 import {
   ServiceContext,
   serviceContextFromDefaults,
-} from "../../ServiceContext";
-import { Event } from "../../callbacks/CallbackManager";
-import { randomUUID } from "../../env";
-import { PromptMixin } from "../../prompts";
+} from "../../ServiceContext.js";
+import { Event } from "../../callbacks/CallbackManager.js";
+import { PromptMixin } from "../../prompts/Mixin.js";
 import {
   BaseSynthesizer,
   CompactAndRefine,
   ResponseSynthesizer,
-} from "../../synthesizers";
+} from "../../synthesizers/index.js";
 
 import {
   BaseQueryEngine,
@@ -20,9 +20,9 @@ import {
   QueryEngineParamsNonStreaming,
   QueryEngineParamsStreaming,
   ToolMetadata,
-} from "../../types";
+} from "../../types.js";
 
-import { BaseQuestionGenerator, SubQuestion } from "./types";
+import { BaseQuestionGenerator, SubQuestion } from "./types.js";
 
 /**
  * SubQuestionQueryEngine decomposes a question into subquestions and then
diff --git a/packages/core/src/engines/query/index.ts b/packages/core/src/engines/query/index.ts
index ef1cb9f8341ea1835ab92bc9bafa33b6f36416ab..f07a7c0e7c19af98760d403d661977031e605806 100644
--- a/packages/core/src/engines/query/index.ts
+++ b/packages/core/src/engines/query/index.ts
@@ -1,3 +1,3 @@
-export * from "./RetrieverQueryEngine";
-export * from "./RouterQueryEngine";
-export * from "./SubQuestionQueryEngine";
+export * from "./RetrieverQueryEngine.js";
+export * from "./RouterQueryEngine.js";
+export * from "./SubQuestionQueryEngine.js";
diff --git a/packages/core/src/engines/query/types.ts b/packages/core/src/engines/query/types.ts
index 4fd9c63dd838bebfe3a764cc9f16389893510485..0db0e32592e04c0f2d3c0b57307dd57af18855a7 100644
--- a/packages/core/src/engines/query/types.ts
+++ b/packages/core/src/engines/query/types.ts
@@ -1,4 +1,4 @@
-import { ToolMetadata } from "../../types";
+import { ToolMetadata } from "../../types.js";
 
 /**
  * QuestionGenerators generate new questions for the LLM using tools and a user query.
diff --git a/packages/core/src/extractors/MetadataExtractors.ts b/packages/core/src/extractors/MetadataExtractors.ts
index f41e3f8605bc16d416b47c0b9ae7162cc8d472be..b3db824dcab26e1ed0fa7f43fbfd7d1f585b3e31 100644
--- a/packages/core/src/extractors/MetadataExtractors.ts
+++ b/packages/core/src/extractors/MetadataExtractors.ts
@@ -1,13 +1,13 @@
-import { BaseNode, MetadataMode, TextNode } from "../Node";
-import { LLM, OpenAI } from "../llm";
+import { BaseNode, MetadataMode, TextNode } from "../Node.js";
+import { LLM, OpenAI } from "../llm/index.js";
 import {
   defaultKeywordExtractorPromptTemplate,
   defaultQuestionAnswerPromptTemplate,
   defaultSummaryExtractorPromptTemplate,
   defaultTitleCombinePromptTemplate,
   defaultTitleExtractorPromptTemplate,
-} from "./prompts";
-import { BaseExtractor } from "./types";
+} from "./prompts.js";
+import { BaseExtractor } from "./types.js";
 
 const STRIP_REGEX = /(\r\n|\n|\r)/gm;
 
diff --git a/packages/core/src/extractors/index.ts b/packages/core/src/extractors/index.ts
index b54a52845b987dd5f542ceeef2ab41de967a63f8..18f6c25efeb84fd47099fe33c481382ed963c0f3 100644
--- a/packages/core/src/extractors/index.ts
+++ b/packages/core/src/extractors/index.ts
@@ -3,5 +3,5 @@ export {
   QuestionsAnsweredExtractor,
   SummaryExtractor,
   TitleExtractor,
-} from "./MetadataExtractors";
-export { BaseExtractor } from "./types";
+} from "./MetadataExtractors.js";
+export { BaseExtractor } from "./types.js";
diff --git a/packages/core/src/extractors/types.ts b/packages/core/src/extractors/types.ts
index adac96be438c411151c731c040c8add367bb4b0a..58f3da987561e2e51fd92177d5f72c16b735e9bf 100644
--- a/packages/core/src/extractors/types.ts
+++ b/packages/core/src/extractors/types.ts
@@ -1,6 +1,6 @@
-import { BaseNode, MetadataMode, TextNode } from "../Node";
-import { TransformComponent } from "../ingestion";
-import { defaultNodeTextTemplate } from "./prompts";
+import { BaseNode, MetadataMode, TextNode } from "../Node.js";
+import { TransformComponent } from "../ingestion/types.js";
+import { defaultNodeTextTemplate } from "./prompts.js";
 
 /*
  * Abstract class for all extractors.
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
index 87b465845a87f14720c4499eedbc1e40c4e2e9bf..5cdaacea490a71e3947dec5b6b5f4ef254ff4160 100644
--- a/packages/core/src/index.ts
+++ b/packages/core/src/index.ts
@@ -1,31 +1,31 @@
-export * from "./ChatHistory";
-export * from "./GlobalsHelper";
-export * from "./Node";
-export * from "./OutputParser";
-export * from "./Prompt";
-export * from "./PromptHelper";
-export * from "./QuestionGenerator";
-export * from "./Response";
-export * from "./Retriever";
-export * from "./ServiceContext";
-export * from "./TextSplitter";
-export * from "./agent";
-export * from "./callbacks/CallbackManager";
-export * from "./cloud";
-export * from "./constants";
-export * from "./embeddings";
-export * from "./engines/chat";
-export * from "./engines/query";
-export * from "./extractors";
-export * from "./indices";
-export * from "./ingestion";
-export * from "./llm";
-export * from "./nodeParsers";
-export * from "./objects";
-export * from "./postprocessors";
-export * from "./prompts";
-export * from "./readers";
-export * from "./selectors";
-export * from "./storage";
-export * from "./synthesizers";
-export * from "./tools";
+export * from "./ChatHistory.js";
+export * from "./GlobalsHelper.js";
+export * from "./Node.js";
+export * from "./OutputParser.js";
+export * from "./Prompt.js";
+export * from "./PromptHelper.js";
+export * from "./QuestionGenerator.js";
+export * from "./Response.js";
+export * from "./Retriever.js";
+export * from "./ServiceContext.js";
+export * from "./TextSplitter.js";
+export * from "./agent/index.js";
+export * from "./callbacks/CallbackManager.js";
+export * from "./cloud/index.js";
+export * from "./constants.js";
+export * from "./embeddings/index.js";
+export * from "./engines/chat/index.js";
+export * from "./engines/query/index.js";
+export * from "./extractors/index.js";
+export * from "./indices/index.js";
+export * from "./ingestion/index.js";
+export * from "./llm/index.js";
+export * from "./nodeParsers/index.js";
+export * from "./objects/index.js";
+export * from "./postprocessors/index.js";
+export * from "./prompts/index.js";
+export * from "./readers/index.js";
+export * from "./selectors/index.js";
+export * from "./storage/index.js";
+export * from "./synthesizers/index.js";
+export * from "./tools/index.js";
diff --git a/packages/core/src/indices/BaseIndex.ts b/packages/core/src/indices/BaseIndex.ts
index db04a12853d4c12aa910d68f601dfe71726c4e8f..cf0083e0628c6cf850b78de9049664c2b909d7d3 100644
--- a/packages/core/src/indices/BaseIndex.ts
+++ b/packages/core/src/indices/BaseIndex.ts
@@ -1,112 +1,15 @@
-import { BaseNode, Document, jsonToNode } from "../Node";
-import { BaseRetriever } from "../Retriever";
-import { ServiceContext } from "../ServiceContext";
-import { randomUUID } from "../env";
-import { runTransformations } from "../ingestion";
-import { StorageContext } from "../storage/StorageContext";
-import { BaseDocumentStore } from "../storage/docStore/types";
-import { BaseIndexStore } from "../storage/indexStore/types";
-import { VectorStore } from "../storage/vectorStore/types";
-import { BaseSynthesizer } from "../synthesizers";
-import { BaseQueryEngine } from "../types";
-
-/**
- * The underlying structure of each index.
- */
-export abstract class IndexStruct {
-  indexId: string;
-  summary?: string;
-
-  constructor(indexId = randomUUID(), summary = undefined) {
-    this.indexId = indexId;
-    this.summary = summary;
-  }
-
-  toJson(): Record<string, unknown> {
-    return {
-      indexId: this.indexId,
-      summary: this.summary,
-    };
-  }
-
-  getSummary(): string {
-    if (this.summary === undefined) {
-      throw new Error("summary field of the index dict is not set");
-    }
-    return this.summary;
-  }
-}
-
-export enum IndexStructType {
-  SIMPLE_DICT = "simple_dict",
-  LIST = "list",
-  KEYWORD_TABLE = "keyword_table",
-}
-
-export class IndexDict extends IndexStruct {
-  nodesDict: Record<string, BaseNode> = {};
-  type: IndexStructType = IndexStructType.SIMPLE_DICT;
-
-  getSummary(): string {
-    if (this.summary === undefined) {
-      throw new Error("summary field of the index dict is not set");
-    }
-    return this.summary;
-  }
-
-  addNode(node: BaseNode, textId?: string) {
-    const vectorId = textId ?? node.id_;
-    this.nodesDict[vectorId] = node;
-  }
-
-  toJson(): Record<string, unknown> {
-    return {
-      ...super.toJson(),
-      nodesDict: this.nodesDict,
-      type: this.type,
-    };
-  }
-
-  delete(nodeId: string) {
-    delete this.nodesDict[nodeId];
-  }
-}
-
-export function jsonToIndexStruct(json: any): IndexStruct {
-  if (json.type === IndexStructType.LIST) {
-    const indexList = new IndexList(json.indexId, json.summary);
-    indexList.nodes = json.nodes;
-    return indexList;
-  } else if (json.type === IndexStructType.SIMPLE_DICT) {
-    const indexDict = new IndexDict(json.indexId, json.summary);
-    indexDict.nodesDict = Object.entries(json.nodesDict).reduce<
-      Record<string, BaseNode>
-    >((acc, [key, value]) => {
-      acc[key] = jsonToNode(value);
-      return acc;
-    }, {});
-    return indexDict;
-  } else {
-    throw new Error(`Unknown index struct type: ${json.type}`);
-  }
-}
-
-export class IndexList extends IndexStruct {
-  nodes: string[] = [];
-  type: IndexStructType = IndexStructType.LIST;
-
-  addNode(node: BaseNode) {
-    this.nodes.push(node.id_);
-  }
-
-  toJson(): Record<string, unknown> {
-    return {
-      ...super.toJson(),
-      nodes: this.nodes,
-      type: this.type,
-    };
-  }
-}
+import { BaseNode, Document } from "../Node.js";
+import { BaseRetriever } from "../Retriever.js";
+import { ServiceContext } from "../ServiceContext.js";
+import { runTransformations } from "../ingestion/IngestionPipeline.js";
+import { StorageContext } from "../storage/StorageContext.js";
+import { BaseDocumentStore } from "../storage/docStore/types.js";
+import { BaseIndexStore } from "../storage/indexStore/types.js";
+import { VectorStore } from "../storage/vectorStore/types.js";
+import { BaseSynthesizer } from "../synthesizers/types.js";
+import { BaseQueryEngine } from "../types.js";
+import { IndexStruct } from "./IndexStruct.js";
+import { IndexStructType } from "./json-to-index-struct.js";
 
 // A table of keywords mapping keywords to text chunks.
 export class KeywordTable extends IndexStruct {
diff --git a/packages/core/src/indices/IndexStruct.ts b/packages/core/src/indices/IndexStruct.ts
new file mode 100644
index 0000000000000000000000000000000000000000..462fa92150c237862fb440b214b8a029e3a4770d
--- /dev/null
+++ b/packages/core/src/indices/IndexStruct.ts
@@ -0,0 +1,28 @@
+import { randomUUID } from "@llamaindex/env";
+
+/**
+ * The underlying structure of each index.
+ */
+export abstract class IndexStruct {
+  indexId: string;
+  summary?: string;
+
+  constructor(indexId = randomUUID(), summary = undefined) {
+    this.indexId = indexId;
+    this.summary = summary;
+  }
+
+  toJson(): Record<string, unknown> {
+    return {
+      indexId: this.indexId,
+      summary: this.summary,
+    };
+  }
+
+  getSummary(): string {
+    if (this.summary === undefined) {
+      throw new Error("summary field of the index dict is not set");
+    }
+    return this.summary;
+  }
+}
diff --git a/packages/core/src/indices/index.ts b/packages/core/src/indices/index.ts
index 8bda05b2d954cefd6a58893edc0efb095971a102..9fce474e42c7d132cb9634d4559fd71f6735914e 100644
--- a/packages/core/src/indices/index.ts
+++ b/packages/core/src/indices/index.ts
@@ -1,4 +1,4 @@
-export * from "./BaseIndex";
-export * from "./keyword";
-export * from "./summary";
-export * from "./vectorStore";
+export * from "./BaseIndex.js";
+export * from "./keyword/index.js";
+export * from "./summary/index.js";
+export * from "./vectorStore/index.js";
diff --git a/packages/core/src/indices/json-to-index-struct.ts b/packages/core/src/indices/json-to-index-struct.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ebe72174e22ee41481978a325f1c1ce909e5a4eb
--- /dev/null
+++ b/packages/core/src/indices/json-to-index-struct.ts
@@ -0,0 +1,71 @@
+import { BaseNode, jsonToNode } from "../Node.js";
+import { IndexStruct } from "./IndexStruct.js";
+
+export enum IndexStructType {
+  SIMPLE_DICT = "simple_dict",
+  LIST = "list",
+  KEYWORD_TABLE = "keyword_table",
+}
+export class IndexDict extends IndexStruct {
+  nodesDict: Record<string, BaseNode> = {};
+  type: IndexStructType = IndexStructType.SIMPLE_DICT;
+
+  getSummary(): string {
+    if (this.summary === undefined) {
+      throw new Error("summary field of the index dict is not set");
+    }
+    return this.summary;
+  }
+
+  addNode(node: BaseNode, textId?: string) {
+    const vectorId = textId ?? node.id_;
+    this.nodesDict[vectorId] = node;
+  }
+
+  toJson(): Record<string, unknown> {
+    return {
+      ...super.toJson(),
+      nodesDict: this.nodesDict,
+      type: this.type,
+    };
+  }
+
+  delete(nodeId: string) {
+    delete this.nodesDict[nodeId];
+  }
+}
+export function jsonToIndexStruct(json: any): IndexStruct {
+  if (json.type === IndexStructType.LIST) {
+    const indexList = new IndexList(json.indexId, json.summary);
+    indexList.nodes = json.nodes;
+    return indexList;
+  } else if (json.type === IndexStructType.SIMPLE_DICT) {
+    const indexDict = new IndexDict(json.indexId, json.summary);
+    indexDict.nodesDict = Object.entries(json.nodesDict).reduce<
+      Record<string, BaseNode>
+    >((acc, [key, value]) => {
+      acc[key] = jsonToNode(value);
+      return acc;
+    }, {});
+    return indexDict;
+  } else {
+    throw new Error(`Unknown index struct type: ${json.type}`);
+  }
+}
+
+export class IndexList extends IndexStruct {
+  nodes: string[] = [];
+  type: IndexStructType = IndexStructType.LIST;
+
+  addNode(node: BaseNode) {
+    this.nodes.push(node.id_);
+  }
+
+  toJson(): Record<string, unknown> {
+    return {
+      ...super.toJson(),
+      nodes: this.nodes,
+      type: this.type,
+    };
+  }
+}
diff --git a/packages/core/src/indices/keyword/KeywordTableIndex.ts b/packages/core/src/indices/keyword/KeywordTableIndex.ts
deleted file mode 100644
index 474805d7baee5f82e4df635874e6be87473b565a..0000000000000000000000000000000000000000
--- a/packages/core/src/indices/keyword/KeywordTableIndex.ts
+++ /dev/null
@@ -1,278 +0,0 @@
-import { BaseNode, Document, MetadataMode } from "../../Node";
-import { defaultKeywordExtractPrompt } from "../../Prompt";
-import { BaseRetriever } from "../../Retriever";
-import {
-  ServiceContext,
-  serviceContextFromDefaults,
-} from "../../ServiceContext";
-import { RetrieverQueryEngine } from "../../engines/query";
-import { BaseNodePostprocessor } from "../../postprocessors";
-import {
-  BaseDocumentStore,
-  StorageContext,
-  storageContextFromDefaults,
-} from "../../storage";
-import { BaseSynthesizer } from "../../synthesizers";
-import { BaseQueryEngine } from "../../types";
-import {
-  BaseIndex,
-  BaseIndexInit,
-  IndexStructType,
-  KeywordTable,
-} from "../BaseIndex";
-import {
-  KeywordTableLLMRetriever,
-  KeywordTableRAKERetriever,
-  KeywordTableSimpleRetriever,
-} from "./KeywordTableIndexRetriever";
-import { extractKeywordsGivenResponse } from "./utils";
-
-export interface KeywordIndexOptions {
-  nodes?: BaseNode[];
-  indexStruct?: KeywordTable;
-  indexId?: string;
-  serviceContext?: ServiceContext;
-  storageContext?: StorageContext;
-}
-export enum KeywordTableRetrieverMode {
-  DEFAULT = "DEFAULT",
-  SIMPLE = "SIMPLE",
-  RAKE = "RAKE",
-}
-
-const KeywordTableRetrieverMap = {
-  [KeywordTableRetrieverMode.DEFAULT]: KeywordTableLLMRetriever,
-  [KeywordTableRetrieverMode.SIMPLE]: KeywordTableSimpleRetriever,
-  [KeywordTableRetrieverMode.RAKE]: KeywordTableRAKERetriever,
-};
-
-/**
- * The KeywordTableIndex, an index that extracts keywords from each Node and builds a mapping from each keyword to the corresponding Nodes of that keyword.
- */
-export class KeywordTableIndex extends BaseIndex<KeywordTable> {
-  constructor(init: BaseIndexInit<KeywordTable>) {
-    super(init);
-  }
-
-  static async init(options: KeywordIndexOptions): Promise<KeywordTableIndex> {
-    const storageContext =
-      options.storageContext ?? (await storageContextFromDefaults({}));
-    const serviceContext =
-      options.serviceContext ?? serviceContextFromDefaults({});
-    const { docStore, indexStore } = storageContext;
-
-    // Setup IndexStruct from storage
-    const indexStructs = (await indexStore.getIndexStructs()) as KeywordTable[];
-    let indexStruct: KeywordTable | null;
-
-    if (options.indexStruct && indexStructs.length > 0) {
-      throw new Error(
-        "Cannot initialize index with both indexStruct and indexStore",
-      );
-    }
-
-    if (options.indexStruct) {
-      indexStruct = options.indexStruct;
-    } else if (indexStructs.length == 1) {
-      indexStruct = indexStructs[0];
-    } else if (indexStructs.length > 1 && options.indexId) {
-      indexStruct = (await indexStore.getIndexStruct(
-        options.indexId,
-      )) as KeywordTable;
-    } else {
-      indexStruct = null;
-    }
-
-    // check indexStruct type
-    if (indexStruct && indexStruct.type !== IndexStructType.KEYWORD_TABLE) {
-      throw new Error(
-        "Attempting to initialize KeywordTableIndex with non-keyword table indexStruct",
-      );
-    }
-
-    if (indexStruct) {
-      if (options.nodes) {
-        throw new Error(
-          "Cannot initialize KeywordTableIndex with both nodes and indexStruct",
-        );
-      }
-    } else {
-      if (!options.nodes) {
-        throw new Error(
-          "Cannot initialize KeywordTableIndex without nodes or indexStruct",
-        );
-      }
-      indexStruct = await KeywordTableIndex.buildIndexFromNodes(
-        options.nodes,
-        storageContext.docStore,
-        serviceContext,
-      );
-
-      await indexStore.addIndexStruct(indexStruct);
-    }
-
-    return new KeywordTableIndex({
-      storageContext,
-      serviceContext,
-      docStore,
-      indexStore,
-      indexStruct,
-    });
-  }
-
-  asRetriever(options?: any): BaseRetriever {
-    const { mode = KeywordTableRetrieverMode.DEFAULT, ...otherOptions } =
-      options ?? {};
-    const KeywordTableRetriever =
-      KeywordTableRetrieverMap[mode as KeywordTableRetrieverMode];
-    if (KeywordTableRetriever) {
-      return new KeywordTableRetriever({ index: this, ...otherOptions });
-    }
-    throw new Error(`Unknown retriever mode: ${mode}`);
-  }
-
-  asQueryEngine(options?: {
-    retriever?: BaseRetriever;
-    responseSynthesizer?: BaseSynthesizer;
-    preFilters?: unknown;
-    nodePostprocessors?: BaseNodePostprocessor[];
-  }): BaseQueryEngine {
-    const { retriever, responseSynthesizer } = options ?? {};
-    return new RetrieverQueryEngine(
-      retriever ?? this.asRetriever(),
-      responseSynthesizer,
-      options?.preFilters,
-      options?.nodePostprocessors,
-    );
-  }
-
-  static async extractKeywords(
-    text: string,
-    serviceContext: ServiceContext,
-  ): Promise<Set<string>> {
-    const response = await serviceContext.llm.complete({
-      prompt: defaultKeywordExtractPrompt({
-        context: text,
-      }),
-    });
-    return extractKeywordsGivenResponse(response.text, "KEYWORDS:");
-  }
-
-  /**
-   * High level API: split documents, get keywords, and build index.
-   * @param documents
-   * @param storageContext
-   * @param serviceContext
-   * @returns
-   */
-  static async fromDocuments(
-    documents: Document[],
-    args: {
-      storageContext?: StorageContext;
-      serviceContext?: ServiceContext;
-    } = {},
-  ): Promise<KeywordTableIndex> {
-    let { storageContext, serviceContext } = args;
-    storageContext = storageContext ?? (await storageContextFromDefaults({}));
-    serviceContext = serviceContext ?? serviceContextFromDefaults({});
-    const docStore = storageContext.docStore;
-
-    docStore.addDocuments(documents, true);
-    for (const doc of documents) {
-      docStore.setDocumentHash(doc.id_, doc.hash);
-    }
-
-    const nodes = serviceContext.nodeParser.getNodesFromDocuments(documents);
-    const index = await KeywordTableIndex.init({
-      nodes,
-      storageContext,
-      serviceContext,
-    });
-    return index;
-  }
-
-  /**
-   * Get keywords for nodes and place them into the index.
-   * @param nodes
-   * @param serviceContext
-   * @param vectorStore
-   * @returns
-   */
-  static async buildIndexFromNodes(
-    nodes: BaseNode[],
-    docStore: BaseDocumentStore,
-    serviceContext: ServiceContext,
-  ): Promise<KeywordTable> {
-    const indexStruct = new KeywordTable();
-    await docStore.addDocuments(nodes, true);
-    for (const node of nodes) {
-      const keywords = await KeywordTableIndex.extractKeywords(
-        node.getContent(MetadataMode.LLM),
-        serviceContext,
-      );
-      indexStruct.addNode([...keywords], node.id_);
-    }
-    return indexStruct;
-  }
-
-  async insertNodes(nodes: BaseNode[]) {
-    for (const node of nodes) {
-      const keywords = await KeywordTableIndex.extractKeywords(
-        node.getContent(MetadataMode.LLM),
-        this.serviceContext,
-      );
-      this.indexStruct.addNode([...keywords], node.id_);
-    }
-  }
-
-  deleteNode(nodeId: string): void {
-    const keywordsToDelete: Set<string> = new Set();
-    for (const [keyword, existingNodeIds] of Object.entries(
-      this.indexStruct.table,
-    )) {
-      const index = existingNodeIds.indexOf(nodeId);
-      if (index !== -1) {
-        existingNodeIds.splice(index, 1);
-
-        // Delete keywords that have zero nodes
-        if (existingNodeIds.length === 0) {
-          keywordsToDelete.add(keyword);
-        }
-      }
-    }
-    this.indexStruct.deleteNode([...keywordsToDelete], nodeId);
-  }
-
-  async deleteNodes(nodeIds: string[], deleteFromDocStore: boolean) {
-    nodeIds.forEach((nodeId) => {
-      this.deleteNode(nodeId);
-    });
-
-    if (deleteFromDocStore) {
-      for (const nodeId of nodeIds) {
-        await this.docStore.deleteDocument(nodeId, false);
-      }
-    }
-
-    await this.storageContext.indexStore.addIndexStruct(this.indexStruct);
-  }
-
-  async deleteRefDoc(
-    refDocId: string,
-    deleteFromDocStore?: boolean,
-  ): Promise<void> {
-    const refDocInfo = await this.docStore.getRefDocInfo(refDocId);
-
-    if (!refDocInfo) {
-      return;
-    }
-
-    await this.deleteNodes(refDocInfo.nodeIds, false);
-
-    if (deleteFromDocStore) {
-      await this.docStore.deleteRefDoc(refDocId, false);
-    }
-
-    return;
-  }
-}
diff --git a/packages/core/src/indices/keyword/KeywordTableIndexRetriever.ts b/packages/core/src/indices/keyword/KeywordTableIndexRetriever.ts
deleted file mode 100644
index b1a27f69916c3e7629459a5d82ac63863c4ea920..0000000000000000000000000000000000000000
--- a/packages/core/src/indices/keyword/KeywordTableIndexRetriever.ts
+++ /dev/null
@@ -1,116 +0,0 @@
-import { NodeWithScore } from "../../Node";
-import {
-  defaultKeywordExtractPrompt,
-  defaultQueryKeywordExtractPrompt,
-  KeywordExtractPrompt,
-  QueryKeywordExtractPrompt,
-} from "../../Prompt";
-import { BaseRetriever } from "../../Retriever";
-import { ServiceContext } from "../../ServiceContext";
-import { BaseDocumentStore } from "../../storage/docStore/types";
-import { KeywordTable } from "../BaseIndex";
-import { KeywordTableIndex } from "./KeywordTableIndex";
-import {
-  extractKeywordsGivenResponse,
-  rakeExtractKeywords,
-  simpleExtractKeywords,
-} from "./utils";
-
-// Base Keyword Table Retriever
-abstract class BaseKeywordTableRetriever implements BaseRetriever {
-  protected index: KeywordTableIndex;
-  protected indexStruct: KeywordTable;
-  protected docstore: BaseDocumentStore;
-  protected serviceContext: ServiceContext;
-
-  protected maxKeywordsPerQuery: number; // Maximum number of keywords to extract from query.
-  protected numChunksPerQuery: number; // Maximum number of text chunks to query.
-  protected keywordExtractTemplate: KeywordExtractPrompt; // A Keyword Extraction Prompt
-  protected queryKeywordExtractTemplate: QueryKeywordExtractPrompt; // A Query Keyword Extraction Prompt
-
-  constructor({
-    index,
-    keywordExtractTemplate,
-    queryKeywordExtractTemplate,
-    maxKeywordsPerQuery = 10,
-    numChunksPerQuery = 10,
-  }: {
-    index: KeywordTableIndex;
-    keywordExtractTemplate?: KeywordExtractPrompt;
-    queryKeywordExtractTemplate?: QueryKeywordExtractPrompt;
-    maxKeywordsPerQuery: number;
-    numChunksPerQuery: number;
-  }) {
-    this.index = index;
-    this.indexStruct = index.indexStruct;
-    this.docstore = index.docStore;
-    this.serviceContext = index.serviceContext;
-
-    this.maxKeywordsPerQuery = maxKeywordsPerQuery;
-    this.numChunksPerQuery = numChunksPerQuery;
-    this.keywordExtractTemplate =
-      keywordExtractTemplate || defaultKeywordExtractPrompt;
-    this.queryKeywordExtractTemplate =
-      queryKeywordExtractTemplate || defaultQueryKeywordExtractPrompt;
-  }
-
-  abstract getKeywords(query: string): Promise<string[]>;
-
-  async retrieve(query: string): Promise<NodeWithScore[]> {
-    const keywords = await this.getKeywords(query);
-    const chunkIndicesCount: { [key: string]: number } = {};
-    const filteredKeywords = keywords.filter((keyword) =>
-      this.indexStruct.table.has(keyword),
-    );
-
-    for (const keyword of filteredKeywords) {
-      for (const nodeId of this.indexStruct.table.get(keyword) || []) {
-        chunkIndicesCount[nodeId] = (chunkIndicesCount[nodeId] ?? 0) + 1;
-      }
-    }
-
-    const sortedChunkIndices = Object.keys(chunkIndicesCount)
-      .sort((a, b) => chunkIndicesCount[b] - chunkIndicesCount[a])
-      .slice(0, this.numChunksPerQuery);
-
-    const sortedNodes = await this.docstore.getNodes(sortedChunkIndices);
-
-    return sortedNodes.map((node) => ({ node }));
-  }
-
-  getServiceContext(): ServiceContext {
-    return this.index.serviceContext;
-  }
-}
-
-// Extracts keywords using LLMs.
-export class KeywordTableLLMRetriever extends BaseKeywordTableRetriever {
-  async getKeywords(query: string): Promise<string[]> {
-    const response = await this.serviceContext.llm.complete({
-      prompt: this.queryKeywordExtractTemplate({
-        question: query,
-        maxKeywords: this.maxKeywordsPerQuery,
-      }),
-    });
-    const keywords = extractKeywordsGivenResponse(response.text, "KEYWORDS:");
-    return [...keywords];
-  }
-}
-
-// Extracts keywords using simple regex-based keyword extractor.
-export class KeywordTableSimpleRetriever extends BaseKeywordTableRetriever {
-  getKeywords(query: string): Promise<string[]> {
-    return Promise.resolve([
-      ...simpleExtractKeywords(query, this.maxKeywordsPerQuery),
-    ]);
-  }
-}
-
-// Extracts keywords using RAKE keyword extractor
-export class KeywordTableRAKERetriever extends BaseKeywordTableRetriever {
-  getKeywords(query: string): Promise<string[]> {
-    return Promise.resolve([
-      ...rakeExtractKeywords(query, this.maxKeywordsPerQuery),
-    ]);
-  }
-}
diff --git a/packages/core/src/indices/keyword/index.ts b/packages/core/src/indices/keyword/index.ts
index ee7699d085ac0ae0d88e2c2f7ad4655f9c9b2200..3fee6040abb5deaa4e7348a04ed7f06206f24bcc 100644
--- a/packages/core/src/indices/keyword/index.ts
+++ b/packages/core/src/indices/keyword/index.ts
@@ -1,9 +1,377 @@
-export {
-  KeywordTableIndex,
-  KeywordTableRetrieverMode,
-} from "./KeywordTableIndex";
-export {
-  KeywordTableLLMRetriever,
-  KeywordTableRAKERetriever,
-  KeywordTableSimpleRetriever,
-} from "./KeywordTableIndexRetriever";
+import { BaseNode, Document, MetadataMode, NodeWithScore } from "../../Node.js";
+import {
+  KeywordExtractPrompt,
+  QueryKeywordExtractPrompt,
+  defaultKeywordExtractPrompt,
+  defaultQueryKeywordExtractPrompt,
+} from "../../Prompt.js";
+import { BaseRetriever } from "../../Retriever.js";
+import {
+  ServiceContext,
+  serviceContextFromDefaults,
+} from "../../ServiceContext.js";
+import { RetrieverQueryEngine } from "../../engines/query/index.js";
+import { BaseNodePostprocessor } from "../../postprocessors/index.js";
+import {
+  BaseDocumentStore,
+  StorageContext,
+  storageContextFromDefaults,
+} from "../../storage/index.js";
+import { BaseSynthesizer } from "../../synthesizers/index.js";
+import { BaseQueryEngine } from "../../types.js";
+import { BaseIndex, BaseIndexInit, KeywordTable } from "../BaseIndex.js";
+import { IndexStructType } from "../json-to-index-struct.js";
+import {
+  extractKeywordsGivenResponse,
+  rakeExtractKeywords,
+  simpleExtractKeywords,
+} from "./utils.js";
+
+export interface KeywordIndexOptions {
+  nodes?: BaseNode[];
+  indexStruct?: KeywordTable;
+  indexId?: string;
+  serviceContext?: ServiceContext;
+  storageContext?: StorageContext;
+}
+export enum KeywordTableRetrieverMode {
+  DEFAULT = "DEFAULT",
+  SIMPLE = "SIMPLE",
+  RAKE = "RAKE",
+}
+
+// Base Keyword Table Retriever
+abstract class BaseKeywordTableRetriever implements BaseRetriever {
+  protected index: KeywordTableIndex;
+  protected indexStruct: KeywordTable;
+  protected docstore: BaseDocumentStore;
+  protected serviceContext: ServiceContext;
+
+  protected maxKeywordsPerQuery: number; // Maximum number of keywords to extract from query.
+  protected numChunksPerQuery: number; // Maximum number of text chunks to query.
+  protected keywordExtractTemplate: KeywordExtractPrompt; // A Keyword Extraction Prompt
+  protected queryKeywordExtractTemplate: QueryKeywordExtractPrompt; // A Query Keyword Extraction Prompt
+
+  constructor({
+    index,
+    keywordExtractTemplate,
+    queryKeywordExtractTemplate,
+    maxKeywordsPerQuery = 10,
+    numChunksPerQuery = 10,
+  }: {
+    index: KeywordTableIndex;
+    keywordExtractTemplate?: KeywordExtractPrompt;
+    queryKeywordExtractTemplate?: QueryKeywordExtractPrompt;
+    maxKeywordsPerQuery: number;
+    numChunksPerQuery: number;
+  }) {
+    this.index = index;
+    this.indexStruct = index.indexStruct;
+    this.docstore = index.docStore;
+    this.serviceContext = index.serviceContext;
+
+    this.maxKeywordsPerQuery = maxKeywordsPerQuery;
+    this.numChunksPerQuery = numChunksPerQuery;
+    this.keywordExtractTemplate =
+      keywordExtractTemplate || defaultKeywordExtractPrompt;
+    this.queryKeywordExtractTemplate =
+      queryKeywordExtractTemplate || defaultQueryKeywordExtractPrompt;
+  }
+
+  abstract getKeywords(query: string): Promise<string[]>;
+
+  async retrieve(query: string): Promise<NodeWithScore[]> {
+    const keywords = await this.getKeywords(query);
+    const chunkIndicesCount: { [key: string]: number } = {};
+    const filteredKeywords = keywords.filter((keyword) =>
+      this.indexStruct.table.has(keyword),
+    );
+
+    for (const keyword of filteredKeywords) {
+      for (const nodeId of this.indexStruct.table.get(keyword) || []) {
+        chunkIndicesCount[nodeId] = (chunkIndicesCount[nodeId] ?? 0) + 1;
+      }
+    }
+
+    const sortedChunkIndices = Object.keys(chunkIndicesCount)
+      .sort((a, b) => chunkIndicesCount[b] - chunkIndicesCount[a])
+      .slice(0, this.numChunksPerQuery);
+
+    const sortedNodes = await this.docstore.getNodes(sortedChunkIndices);
+
+    return sortedNodes.map((node) => ({ node }));
+  }
+
+  getServiceContext(): ServiceContext {
+    return this.index.serviceContext;
+  }
+}
+
+// Extracts keywords using LLMs.
+export class KeywordTableLLMRetriever extends BaseKeywordTableRetriever {
+  async getKeywords(query: string): Promise<string[]> {
+    const response = await this.serviceContext.llm.complete({
+      prompt: this.queryKeywordExtractTemplate({
+        question: query,
+        maxKeywords: this.maxKeywordsPerQuery,
+      }),
+    });
+    const keywords = extractKeywordsGivenResponse(response.text, "KEYWORDS:");
+    return [...keywords];
+  }
+}
+
+// Extracts keywords using simple regex-based keyword extractor.
+export class KeywordTableSimpleRetriever extends BaseKeywordTableRetriever {
+  getKeywords(query: string): Promise<string[]> {
+    return Promise.resolve([
+      ...simpleExtractKeywords(query, this.maxKeywordsPerQuery),
+    ]);
+  }
+}
+
+// Extracts keywords using RAKE keyword extractor
+export class KeywordTableRAKERetriever extends BaseKeywordTableRetriever {
+  getKeywords(query: string): Promise<string[]> {
+    return Promise.resolve([
+      ...rakeExtractKeywords(query, this.maxKeywordsPerQuery),
+    ]);
+  }
+}
+
+const KeywordTableRetrieverMap = {
+  [KeywordTableRetrieverMode.DEFAULT]: KeywordTableLLMRetriever,
+  [KeywordTableRetrieverMode.SIMPLE]: KeywordTableSimpleRetriever,
+  [KeywordTableRetrieverMode.RAKE]: KeywordTableRAKERetriever,
+};
+
+/**
+ * The KeywordTableIndex, an index that extracts keywords from each Node and builds a mapping from each keyword to the corresponding Nodes of that keyword.
+ */
+export class KeywordTableIndex extends BaseIndex<KeywordTable> {
+  constructor(init: BaseIndexInit<KeywordTable>) {
+    super(init);
+  }
+
+  static async init(options: KeywordIndexOptions): Promise<KeywordTableIndex> {
+    const storageContext =
+      options.storageContext ?? (await storageContextFromDefaults({}));
+    const serviceContext =
+      options.serviceContext ?? serviceContextFromDefaults({});
+    const { docStore, indexStore } = storageContext;
+
+    // Setup IndexStruct from storage
+    const indexStructs = (await indexStore.getIndexStructs()) as KeywordTable[];
+    let indexStruct: KeywordTable | null;
+
+    if (options.indexStruct && indexStructs.length > 0) {
+      throw new Error(
+        "Cannot initialize index with both indexStruct and indexStore",
+      );
+    }
+
+    if (options.indexStruct) {
+      indexStruct = options.indexStruct;
+    } else if (indexStructs.length == 1) {
+      indexStruct = indexStructs[0];
+    } else if (indexStructs.length > 1 && options.indexId) {
+      indexStruct = (await indexStore.getIndexStruct(
+        options.indexId,
+      )) as KeywordTable;
+    } else {
+      indexStruct = null;
+    }
+
+    // check indexStruct type
+    if (indexStruct && indexStruct.type !== IndexStructType.KEYWORD_TABLE) {
+      throw new Error(
+        "Attempting to initialize KeywordTableIndex with non-keyword table indexStruct",
+      );
+    }
+
+    if (indexStruct) {
+      if (options.nodes) {
+        throw new Error(
+          "Cannot initialize KeywordTableIndex with both nodes and indexStruct",
+        );
+      }
+    } else {
+      if (!options.nodes) {
+        throw new Error(
+          "Cannot initialize KeywordTableIndex without nodes or indexStruct",
+        );
+      }
+      indexStruct = await KeywordTableIndex.buildIndexFromNodes(
+        options.nodes,
+        storageContext.docStore,
+        serviceContext,
+      );
+
+      await indexStore.addIndexStruct(indexStruct);
+    }
+
+    return new KeywordTableIndex({
+      storageContext,
+      serviceContext,
+      docStore,
+      indexStore,
+      indexStruct,
+    });
+  }
+
+  asRetriever(options?: any): BaseRetriever {
+    const { mode = KeywordTableRetrieverMode.DEFAULT, ...otherOptions } =
+      options ?? {};
+    const KeywordTableRetriever =
+      KeywordTableRetrieverMap[mode as KeywordTableRetrieverMode];
+    if (KeywordTableRetriever) {
+      return new KeywordTableRetriever({ index: this, ...otherOptions });
+    }
+    throw new Error(`Unknown retriever mode: ${mode}`);
+  }
+
+  asQueryEngine(options?: {
+    retriever?: BaseRetriever;
+    responseSynthesizer?: BaseSynthesizer;
+    preFilters?: unknown;
+    nodePostprocessors?: BaseNodePostprocessor[];
+  }): BaseQueryEngine {
+    const { retriever, responseSynthesizer } = options ?? {};
+    return new RetrieverQueryEngine(
+      retriever ?? this.asRetriever(),
+      responseSynthesizer,
+      options?.preFilters,
+      options?.nodePostprocessors,
+    );
+  }
+
+  static async extractKeywords(
+    text: string,
+    serviceContext: ServiceContext,
+  ): Promise<Set<string>> {
+    const response = await serviceContext.llm.complete({
+      prompt: defaultKeywordExtractPrompt({
+        context: text,
+      }),
+    });
+    return extractKeywordsGivenResponse(response.text, "KEYWORDS:");
+  }
+
+  /**
+   * High level API: split documents, get keywords, and build index.
+   * @param documents
+   * @param storageContext
+   * @param serviceContext
+   * @returns
+   */
+  static async fromDocuments(
+    documents: Document[],
+    args: {
+      storageContext?: StorageContext;
+      serviceContext?: ServiceContext;
+    } = {},
+  ): Promise<KeywordTableIndex> {
+    let { storageContext, serviceContext } = args;
+    storageContext = storageContext ?? (await storageContextFromDefaults({}));
+    serviceContext = serviceContext ?? serviceContextFromDefaults({});
+    const docStore = storageContext.docStore;
+
+    docStore.addDocuments(documents, true);
+    for (const doc of documents) {
+      docStore.setDocumentHash(doc.id_, doc.hash);
+    }
+
+    const nodes = serviceContext.nodeParser.getNodesFromDocuments(documents);
+    const index = await KeywordTableIndex.init({
+      nodes,
+      storageContext,
+      serviceContext,
+    });
+    return index;
+  }
+
+  /**
+   * Get keywords for nodes and place them into the index.
+   * @param nodes
+   * @param serviceContext
+   * @param vectorStore
+   * @returns
+   */
+  static async buildIndexFromNodes(
+    nodes: BaseNode[],
+    docStore: BaseDocumentStore,
+    serviceContext: ServiceContext,
+  ): Promise<KeywordTable> {
+    const indexStruct = new KeywordTable();
+    await docStore.addDocuments(nodes, true);
+    for (const node of nodes) {
+      const keywords = await KeywordTableIndex.extractKeywords(
+        node.getContent(MetadataMode.LLM),
+        serviceContext,
+      );
+      indexStruct.addNode([...keywords], node.id_);
+    }
+    return indexStruct;
+  }
+
+  async insertNodes(nodes: BaseNode[]) {
+    for (const node of nodes) {
+      const keywords = await KeywordTableIndex.extractKeywords(
+        node.getContent(MetadataMode.LLM),
+        this.serviceContext,
+      );
+      this.indexStruct.addNode([...keywords], node.id_);
+    }
+  }
+
+  deleteNode(nodeId: string): void {
+    const keywordsToDelete: Set<string> = new Set();
+    for (const [keyword, existingNodeIds] of Object.entries(
+      this.indexStruct.table,
+    )) {
+      const index = existingNodeIds.indexOf(nodeId);
+      if (index !== -1) {
+        existingNodeIds.splice(index, 1);
+
+        // Delete keywords that have zero nodes
+        if (existingNodeIds.length === 0) {
+          keywordsToDelete.add(keyword);
+        }
+      }
+    }
+    this.indexStruct.deleteNode([...keywordsToDelete], nodeId);
+  }
+
+  async deleteNodes(nodeIds: string[], deleteFromDocStore: boolean) {
+    nodeIds.forEach((nodeId) => {
+      this.deleteNode(nodeId);
+    });
+
+    if (deleteFromDocStore) {
+      for (const nodeId of nodeIds) {
+        await this.docStore.deleteDocument(nodeId, false);
+      }
+    }
+
+    await this.storageContext.indexStore.addIndexStruct(this.indexStruct);
+  }
+
+  async deleteRefDoc(
+    refDocId: string,
+    deleteFromDocStore?: boolean,
+  ): Promise<void> {
+    const refDocInfo = await this.docStore.getRefDocInfo(refDocId);
+
+    if (!refDocInfo) {
+      return;
+    }
+
+    await this.deleteNodes(refDocInfo.nodeIds, false);
+
+    if (deleteFromDocStore) {
+      await this.docStore.deleteRefDoc(refDocId, false);
+    }
+
+    return;
+  }
+}
diff --git a/packages/core/src/indices/summary/SummaryIndex.ts b/packages/core/src/indices/summary/SummaryIndex.ts
deleted file mode 100644
index 7223f33edb5e2dd43b5e785a4f4161f7b71ee2fa..0000000000000000000000000000000000000000
--- a/packages/core/src/indices/summary/SummaryIndex.ts
+++ /dev/null
@@ -1,268 +0,0 @@
-import _ from "lodash";
-import { BaseNode, Document } from "../../Node";
-import { BaseRetriever } from "../../Retriever";
-import {
-  ServiceContext,
-  serviceContextFromDefaults,
-} from "../../ServiceContext";
-import { RetrieverQueryEngine } from "../../engines/query";
-import { BaseNodePostprocessor } from "../../postprocessors";
-import {
-  BaseDocumentStore,
-  RefDocInfo,
-  StorageContext,
-  storageContextFromDefaults,
-} from "../../storage";
-import {
-  BaseSynthesizer,
-  CompactAndRefine,
-  ResponseSynthesizer,
-} from "../../synthesizers";
-import { BaseQueryEngine } from "../../types";
-import {
-  BaseIndex,
-  BaseIndexInit,
-  IndexList,
-  IndexStructType,
-} from "../BaseIndex";
-import {
-  SummaryIndexLLMRetriever,
-  SummaryIndexRetriever,
-} from "./SummaryIndexRetriever";
-
-export enum SummaryRetrieverMode {
-  DEFAULT = "default",
-  // EMBEDDING = "embedding",
-  LLM = "llm",
-}
-
-export interface SummaryIndexOptions {
-  nodes?: BaseNode[];
-  indexStruct?: IndexList;
-  indexId?: string;
-  serviceContext?: ServiceContext;
-  storageContext?: StorageContext;
-}
-
-/**
- * A SummaryIndex keeps nodes in a sequential order for use with summarization.
- */
-export class SummaryIndex extends BaseIndex<IndexList> {
-  constructor(init: BaseIndexInit<IndexList>) {
-    super(init);
-  }
-
-  static async init(options: SummaryIndexOptions): Promise<SummaryIndex> {
-    const storageContext =
-      options.storageContext ?? (await storageContextFromDefaults({}));
-    const serviceContext =
-      options.serviceContext ?? serviceContextFromDefaults({});
-    const { docStore, indexStore } = storageContext;
-
-    // Setup IndexStruct from storage
-    const indexStructs = (await indexStore.getIndexStructs()) as IndexList[];
-    let indexStruct: IndexList | null;
-
-    if (options.indexStruct && indexStructs.length > 0) {
-      throw new Error(
-        "Cannot initialize index with both indexStruct and indexStore",
-      );
-    }
-
-    if (options.indexStruct) {
-      indexStruct = options.indexStruct;
-    } else if (indexStructs.length == 1) {
-      indexStruct = indexStructs[0];
-    } else if (indexStructs.length > 1 && options.indexId) {
-      indexStruct = (await indexStore.getIndexStruct(
-        options.indexId,
-      )) as IndexList;
-    } else {
-      indexStruct = null;
-    }
-
-    // check indexStruct type
-    if (indexStruct && indexStruct.type !== IndexStructType.LIST) {
-      throw new Error(
-        "Attempting to initialize SummaryIndex with non-list indexStruct",
-      );
-    }
-
-    if (indexStruct) {
-      if (options.nodes) {
-        throw new Error(
-          "Cannot initialize SummaryIndex with both nodes and indexStruct",
-        );
-      }
-    } else {
-      if (!options.nodes) {
-        throw new Error(
-          "Cannot initialize SummaryIndex without nodes or indexStruct",
-        );
-      }
-      indexStruct = await SummaryIndex.buildIndexFromNodes(
-        options.nodes,
-        storageContext.docStore,
-      );
-
-      await indexStore.addIndexStruct(indexStruct);
-    }
-
-    return new SummaryIndex({
-      storageContext,
-      serviceContext,
-      docStore,
-      indexStore,
-      indexStruct,
-    });
-  }
-
-  static async fromDocuments(
-    documents: Document[],
-    args: {
-      storageContext?: StorageContext;
-      serviceContext?: ServiceContext;
-    } = {},
-  ): Promise<SummaryIndex> {
-    let { storageContext, serviceContext } = args;
-    storageContext = storageContext ?? (await storageContextFromDefaults({}));
-    serviceContext = serviceContext ?? serviceContextFromDefaults({});
-    const docStore = storageContext.docStore;
-
-    docStore.addDocuments(documents, true);
-    for (const doc of documents) {
-      docStore.setDocumentHash(doc.id_, doc.hash);
-    }
-
-    const nodes = serviceContext.nodeParser.getNodesFromDocuments(documents);
-    const index = await SummaryIndex.init({
-      nodes,
-      storageContext,
-      serviceContext,
-    });
-    return index;
-  }
-
-  asRetriever(options?: { mode: SummaryRetrieverMode }): BaseRetriever {
-    const { mode = SummaryRetrieverMode.DEFAULT } = options ?? {};
-
-    switch (mode) {
-      case SummaryRetrieverMode.DEFAULT:
-        return new SummaryIndexRetriever(this);
-      case SummaryRetrieverMode.LLM:
-        return new SummaryIndexLLMRetriever(this);
-      default:
-        throw new Error(`Unknown retriever mode: ${mode}`);
-    }
-  }
-
-  asQueryEngine(options?: {
-    retriever?: BaseRetriever;
-    responseSynthesizer?: BaseSynthesizer;
-    preFilters?: unknown;
-    nodePostprocessors?: BaseNodePostprocessor[];
-  }): BaseQueryEngine {
-    let { retriever, responseSynthesizer } = options ?? {};
-
-    if (!retriever) {
-      retriever = this.asRetriever();
-    }
-
-    if (!responseSynthesizer) {
-      const responseBuilder = new CompactAndRefine(this.serviceContext);
-      responseSynthesizer = new ResponseSynthesizer({
-        serviceContext: this.serviceContext,
-        responseBuilder,
-      });
-    }
-
-    return new RetrieverQueryEngine(
-      retriever,
-      responseSynthesizer,
-      options?.preFilters,
-      options?.nodePostprocessors,
-    );
-  }
-
-  static async buildIndexFromNodes(
-    nodes: BaseNode[],
-    docStore: BaseDocumentStore,
-    indexStruct?: IndexList,
-  ): Promise<IndexList> {
-    indexStruct = indexStruct || new IndexList();
-
-    await docStore.addDocuments(nodes, true);
-    for (const node of nodes) {
-      indexStruct.addNode(node);
-    }
-
-    return indexStruct;
-  }
-
-  async insertNodes(nodes: BaseNode[]): Promise<void> {
-    for (const node of nodes) {
-      this.indexStruct.addNode(node);
-    }
-  }
-
-  async deleteRefDoc(
-    refDocId: string,
-    deleteFromDocStore?: boolean,
-  ): Promise<void> {
-    const refDocInfo = await this.docStore.getRefDocInfo(refDocId);
-
-    if (!refDocInfo) {
-      return;
-    }
-
-    await this.deleteNodes(refDocInfo.nodeIds, false);
-
-    if (deleteFromDocStore) {
-      await this.docStore.deleteRefDoc(refDocId, false);
-    }
-
-    return;
-  }
-
-  async deleteNodes(nodeIds: string[], deleteFromDocStore: boolean) {
-    this.indexStruct.nodes = this.indexStruct.nodes.filter(
-      (existingNodeId: string) => !nodeIds.includes(existingNodeId),
-    );
-
-    if (deleteFromDocStore) {
-      for (const nodeId of nodeIds) {
-        await this.docStore.deleteDocument(nodeId, false);
-      }
-    }
-
-    await this.storageContext.indexStore.addIndexStruct(this.indexStruct);
-  }
-
-  async getRefDocInfo(): Promise<Record<string, RefDocInfo>> {
-    const nodeDocIds = this.indexStruct.nodes;
-    const nodes = await this.docStore.getNodes(nodeDocIds);
-
-    const refDocInfoMap: Record<string, RefDocInfo> = {};
-
-    for (const node of nodes) {
-      const refNode = node.sourceNode;
-      if (_.isNil(refNode)) {
-        continue;
-      }
-
-      const refDocInfo = await this.docStore.getRefDocInfo(refNode.nodeId);
-
-      if (_.isNil(refDocInfo)) {
-        continue;
-      }
-
-      refDocInfoMap[refNode.nodeId] = refDocInfo;
-    }
-
-    return refDocInfoMap;
-  }
-}
-
-// Legacy
-export type ListIndex = SummaryIndex;
-export type ListRetrieverMode = SummaryRetrieverMode;
diff --git a/packages/core/src/indices/summary/SummaryIndexRetriever.ts b/packages/core/src/indices/summary/SummaryIndexRetriever.ts
deleted file mode 100644
index 173b58d000ce655ab54a8c4f2431fe141605447d..0000000000000000000000000000000000000000
--- a/packages/core/src/indices/summary/SummaryIndexRetriever.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-import _ from "lodash";
-import { globalsHelper } from "../../GlobalsHelper";
-import { NodeWithScore } from "../../Node";
-import { ChoiceSelectPrompt, defaultChoiceSelectPrompt } from "../../Prompt";
-import { BaseRetriever } from "../../Retriever";
-import { ServiceContext } from "../../ServiceContext";
-import { Event } from "../../callbacks/CallbackManager";
-import { SummaryIndex } from "./SummaryIndex";
-import {
-  ChoiceSelectParserFunction,
-  NodeFormatterFunction,
-  defaultFormatNodeBatchFn,
-  defaultParseChoiceSelectAnswerFn,
-} from "./utils";
-
-/**
- * Simple retriever for SummaryIndex that returns all nodes
- */
-export class SummaryIndexRetriever implements BaseRetriever {
-  index: SummaryIndex;
-
-  constructor(index: SummaryIndex) {
-    this.index = index;
-  }
-
-  async retrieve(query: string, parentEvent?: Event): Promise<NodeWithScore[]> {
-    const nodeIds = this.index.indexStruct.nodes;
-    const nodes = await this.index.docStore.getNodes(nodeIds);
-    const result = nodes.map((node) => ({
-      node: node,
-      score: 1,
-    }));
-
-    if (this.index.serviceContext.callbackManager.onRetrieve) {
-      this.index.serviceContext.callbackManager.onRetrieve({
-        query,
-        nodes: result,
-        event: globalsHelper.createEvent({
-          parentEvent,
-          type: "retrieve",
-        }),
-      });
-    }
-
-    return result;
-  }
-
-  getServiceContext(): ServiceContext {
-    return this.index.serviceContext;
-  }
-}
-
-/**
- * LLM retriever for SummaryIndex which lets you select the most relevant chunks.
- */
-export class SummaryIndexLLMRetriever implements BaseRetriever {
-  index: SummaryIndex;
-  choiceSelectPrompt: ChoiceSelectPrompt;
-  choiceBatchSize: number;
-  formatNodeBatchFn: NodeFormatterFunction;
-  parseChoiceSelectAnswerFn: ChoiceSelectParserFunction;
-  serviceContext: ServiceContext;
-
-  // eslint-disable-next-line max-params
-  constructor(
-    index: SummaryIndex,
-    choiceSelectPrompt?: ChoiceSelectPrompt,
-    choiceBatchSize: number = 10,
-    formatNodeBatchFn?: NodeFormatterFunction,
-    parseChoiceSelectAnswerFn?: ChoiceSelectParserFunction,
-    serviceContext?: ServiceContext,
-  ) {
-    this.index = index;
-    this.choiceSelectPrompt = choiceSelectPrompt || defaultChoiceSelectPrompt;
-    this.choiceBatchSize = choiceBatchSize;
-    this.formatNodeBatchFn = formatNodeBatchFn || defaultFormatNodeBatchFn;
-    this.parseChoiceSelectAnswerFn =
-      parseChoiceSelectAnswerFn || defaultParseChoiceSelectAnswerFn;
-    this.serviceContext = serviceContext || index.serviceContext;
-  }
-
-  async retrieve(query: string, parentEvent?: Event): Promise<NodeWithScore[]> {
-    const nodeIds = this.index.indexStruct.nodes;
-    const results: NodeWithScore[] = [];
-
-    for (let idx = 0; idx < nodeIds.length; idx += this.choiceBatchSize) {
-      const nodeIdsBatch = nodeIds.slice(idx, idx + this.choiceBatchSize);
-      const nodesBatch = await this.index.docStore.getNodes(nodeIdsBatch);
-
-      const fmtBatchStr = this.formatNodeBatchFn(nodesBatch);
-      const input = { context: fmtBatchStr, query: query };
-      const rawResponse = (
-        await this.serviceContext.llm.complete({
-          prompt: this.choiceSelectPrompt(input),
-        })
-      ).text;
-
-      // parseResult is a map from doc number to relevance score
-      const parseResult = this.parseChoiceSelectAnswerFn(
-        rawResponse,
-        nodesBatch.length,
-      );
-      const choiceNodeIds = nodeIdsBatch.filter((nodeId, idx) => {
-        return `${idx}` in parseResult;
-      });
-
-      const choiceNodes = await this.index.docStore.getNodes(choiceNodeIds);
-      const nodeWithScores = choiceNodes.map((node, i) => ({
-        node: node,
-        score: _.get(parseResult, `${i + 1}`, 1),
-      }));
-
-      results.push(...nodeWithScores);
-    }
-
-    if (this.serviceContext.callbackManager.onRetrieve) {
-      this.serviceContext.callbackManager.onRetrieve({
-        query,
-        nodes: results,
-        event: globalsHelper.createEvent({
-          parentEvent,
-          type: "retrieve",
-        }),
-      });
-    }
-
-    return results;
-  }
-
-  getServiceContext(): ServiceContext {
-    return this.serviceContext;
-  }
-}
-
-// Legacy
-export type ListIndexRetriever = SummaryIndexRetriever;
-export type ListIndexLLMRetriever = SummaryIndexLLMRetriever;
diff --git a/packages/core/src/indices/summary/index.ts b/packages/core/src/indices/summary/index.ts
index b6e0c7d5ec0a635bca54be5d7c4ec38945407717..cafa1a2c6f21622ec9116bd5ded72a3a93f0cd3a 100644
--- a/packages/core/src/indices/summary/index.ts
+++ b/packages/core/src/indices/summary/index.ts
@@ -1,10 +1,392 @@
-export { SummaryIndex, SummaryRetrieverMode } from "./SummaryIndex";
-export type { ListIndex, ListRetrieverMode } from "./SummaryIndex";
-export {
-  SummaryIndexLLMRetriever,
-  SummaryIndexRetriever,
-} from "./SummaryIndexRetriever";
-export type {
-  ListIndexLLMRetriever,
-  ListIndexRetriever,
-} from "./SummaryIndexRetriever";
+import _ from "lodash";
+import { globalsHelper } from "../../GlobalsHelper.js";
+import { BaseNode, Document, NodeWithScore } from "../../Node.js";
+import { ChoiceSelectPrompt, defaultChoiceSelectPrompt } from "../../Prompt.js";
+import { BaseRetriever } from "../../Retriever.js";
+import {
+  ServiceContext,
+  serviceContextFromDefaults,
+} from "../../ServiceContext.js";
+import { Event } from "../../callbacks/CallbackManager.js";
+import { RetrieverQueryEngine } from "../../engines/query/index.js";
+import { BaseNodePostprocessor } from "../../postprocessors/index.js";
+import {
+  BaseDocumentStore,
+  RefDocInfo,
+  StorageContext,
+  storageContextFromDefaults,
+} from "../../storage/index.js";
+import {
+  BaseSynthesizer,
+  CompactAndRefine,
+  ResponseSynthesizer,
+} from "../../synthesizers/index.js";
+import { BaseQueryEngine } from "../../types.js";
+import { BaseIndex, BaseIndexInit } from "../BaseIndex.js";
+import { IndexList, IndexStructType } from "../json-to-index-struct.js";
+import {
+  ChoiceSelectParserFunction,
+  NodeFormatterFunction,
+  defaultFormatNodeBatchFn,
+  defaultParseChoiceSelectAnswerFn,
+} from "./utils.js";
+
+export enum SummaryRetrieverMode {
+  DEFAULT = "default",
+  // EMBEDDING = "embedding",
+  LLM = "llm",
+}
+
+export interface SummaryIndexOptions {
+  nodes?: BaseNode[];
+  indexStruct?: IndexList;
+  indexId?: string;
+  serviceContext?: ServiceContext;
+  storageContext?: StorageContext;
+}
+
+/**
+ * A SummaryIndex keeps nodes in a sequential order for use with summarization.
+ */
+export class SummaryIndex extends BaseIndex<IndexList> {
+  constructor(init: BaseIndexInit<IndexList>) {
+    super(init);
+  }
+
+  static async init(options: SummaryIndexOptions): Promise<SummaryIndex> {
+    const storageContext =
+      options.storageContext ?? (await storageContextFromDefaults({}));
+    const serviceContext =
+      options.serviceContext ?? serviceContextFromDefaults({});
+    const { docStore, indexStore } = storageContext;
+
+    // Setup IndexStruct from storage
+    const indexStructs = (await indexStore.getIndexStructs()) as IndexList[];
+    let indexStruct: IndexList | null;
+
+    if (options.indexStruct && indexStructs.length > 0) {
+      throw new Error(
+        "Cannot initialize index with both indexStruct and indexStore",
+      );
+    }
+
+    if (options.indexStruct) {
+      indexStruct = options.indexStruct;
+    } else if (indexStructs.length == 1) {
+      indexStruct = indexStructs[0];
+    } else if (indexStructs.length > 1 && options.indexId) {
+      indexStruct = (await indexStore.getIndexStruct(
+        options.indexId,
+      )) as IndexList;
+    } else {
+      indexStruct = null;
+    }
+
+    // check indexStruct type
+    if (indexStruct && indexStruct.type !== IndexStructType.LIST) {
+      throw new Error(
+        "Attempting to initialize SummaryIndex with non-list indexStruct",
+      );
+    }
+
+    if (indexStruct) {
+      if (options.nodes) {
+        throw new Error(
+          "Cannot initialize SummaryIndex with both nodes and indexStruct",
+        );
+      }
+    } else {
+      if (!options.nodes) {
+        throw new Error(
+          "Cannot initialize SummaryIndex without nodes or indexStruct",
+        );
+      }
+      indexStruct = await SummaryIndex.buildIndexFromNodes(
+        options.nodes,
+        storageContext.docStore,
+      );
+
+      await indexStore.addIndexStruct(indexStruct);
+    }
+
+    return new SummaryIndex({
+      storageContext,
+      serviceContext,
+      docStore,
+      indexStore,
+      indexStruct,
+    });
+  }
+
+  static async fromDocuments(
+    documents: Document[],
+    args: {
+      storageContext?: StorageContext;
+      serviceContext?: ServiceContext;
+    } = {},
+  ): Promise<SummaryIndex> {
+    let { storageContext, serviceContext } = args;
+    storageContext = storageContext ?? (await storageContextFromDefaults({}));
+    serviceContext = serviceContext ?? serviceContextFromDefaults({});
+    const docStore = storageContext.docStore;
+
+    docStore.addDocuments(documents, true);
+    for (const doc of documents) {
+      docStore.setDocumentHash(doc.id_, doc.hash);
+    }
+
+    const nodes = serviceContext.nodeParser.getNodesFromDocuments(documents);
+    const index = await SummaryIndex.init({
+      nodes,
+      storageContext,
+      serviceContext,
+    });
+    return index;
+  }
+
+  asRetriever(options?: { mode: SummaryRetrieverMode }): BaseRetriever {
+    const { mode = SummaryRetrieverMode.DEFAULT } = options ?? {};
+
+    switch (mode) {
+      case SummaryRetrieverMode.DEFAULT:
+        return new SummaryIndexRetriever(this);
+      case SummaryRetrieverMode.LLM:
+        return new SummaryIndexLLMRetriever(this);
+      default:
+        throw new Error(`Unknown retriever mode: ${mode}`);
+    }
+  }
+
+  asQueryEngine(options?: {
+    retriever?: BaseRetriever;
+    responseSynthesizer?: BaseSynthesizer;
+    preFilters?: unknown;
+    nodePostprocessors?: BaseNodePostprocessor[];
+  }): BaseQueryEngine {
+    let { retriever, responseSynthesizer } = options ?? {};
+
+    if (!retriever) {
+      retriever = this.asRetriever();
+    }
+
+    if (!responseSynthesizer) {
+      const responseBuilder = new CompactAndRefine(this.serviceContext);
+      responseSynthesizer = new ResponseSynthesizer({
+        serviceContext: this.serviceContext,
+        responseBuilder,
+      });
+    }
+
+    return new RetrieverQueryEngine(
+      retriever,
+      responseSynthesizer,
+      options?.preFilters,
+      options?.nodePostprocessors,
+    );
+  }
+
+  static async buildIndexFromNodes(
+    nodes: BaseNode[],
+    docStore: BaseDocumentStore,
+    indexStruct?: IndexList,
+  ): Promise<IndexList> {
+    indexStruct = indexStruct || new IndexList();
+
+    await docStore.addDocuments(nodes, true);
+    for (const node of nodes) {
+      indexStruct.addNode(node);
+    }
+
+    return indexStruct;
+  }
+
+  async insertNodes(nodes: BaseNode[]): Promise<void> {
+    for (const node of nodes) {
+      this.indexStruct.addNode(node);
+    }
+  }
+
+  async deleteRefDoc(
+    refDocId: string,
+    deleteFromDocStore?: boolean,
+  ): Promise<void> {
+    const refDocInfo = await this.docStore.getRefDocInfo(refDocId);
+
+    if (!refDocInfo) {
+      return;
+    }
+
+    await this.deleteNodes(refDocInfo.nodeIds, false);
+
+    if (deleteFromDocStore) {
+      await this.docStore.deleteRefDoc(refDocId, false);
+    }
+
+    return;
+  }
+
+  async deleteNodes(nodeIds: string[], deleteFromDocStore: boolean) {
+    this.indexStruct.nodes = this.indexStruct.nodes.filter(
+      (existingNodeId: string) => !nodeIds.includes(existingNodeId),
+    );
+
+    if (deleteFromDocStore) {
+      for (const nodeId of nodeIds) {
+        await this.docStore.deleteDocument(nodeId, false);
+      }
+    }
+
+    await this.storageContext.indexStore.addIndexStruct(this.indexStruct);
+  }
+
+  async getRefDocInfo(): Promise<Record<string, RefDocInfo>> {
+    const nodeDocIds = this.indexStruct.nodes;
+    const nodes = await this.docStore.getNodes(nodeDocIds);
+
+    const refDocInfoMap: Record<string, RefDocInfo> = {};
+
+    for (const node of nodes) {
+      const refNode = node.sourceNode;
+      if (_.isNil(refNode)) {
+        continue;
+      }
+
+      const refDocInfo = await this.docStore.getRefDocInfo(refNode.nodeId);
+
+      if (_.isNil(refDocInfo)) {
+        continue;
+      }
+
+      refDocInfoMap[refNode.nodeId] = refDocInfo;
+    }
+
+    return refDocInfoMap;
+  }
+}
+
+// Legacy
+export type ListIndex = SummaryIndex;
+export type ListRetrieverMode = SummaryRetrieverMode;
+
+/**
+ * Simple retriever for SummaryIndex that returns all nodes
+ */
+export class SummaryIndexRetriever implements BaseRetriever {
+  index: SummaryIndex;
+
+  constructor(index: SummaryIndex) {
+    this.index = index;
+  }
+
+  async retrieve(query: string, parentEvent?: Event): Promise<NodeWithScore[]> {
+    const nodeIds = this.index.indexStruct.nodes;
+    const nodes = await this.index.docStore.getNodes(nodeIds);
+    const result = nodes.map((node) => ({
+      node: node,
+      score: 1,
+    }));
+
+    if (this.index.serviceContext.callbackManager.onRetrieve) {
+      this.index.serviceContext.callbackManager.onRetrieve({
+        query,
+        nodes: result,
+        event: globalsHelper.createEvent({
+          parentEvent,
+          type: "retrieve",
+        }),
+      });
+    }
+
+    return result;
+  }
+
+  getServiceContext(): ServiceContext {
+    return this.index.serviceContext;
+  }
+}
+
+/**
+ * LLM retriever for SummaryIndex which lets you select the most relevant chunks.
+ */
+export class SummaryIndexLLMRetriever implements BaseRetriever {
+  index: SummaryIndex;
+  choiceSelectPrompt: ChoiceSelectPrompt;
+  choiceBatchSize: number;
+  formatNodeBatchFn: NodeFormatterFunction;
+  parseChoiceSelectAnswerFn: ChoiceSelectParserFunction;
+  serviceContext: ServiceContext;
+
+  // eslint-disable-next-line max-params
+  constructor(
+    index: SummaryIndex,
+    choiceSelectPrompt?: ChoiceSelectPrompt,
+    choiceBatchSize: number = 10,
+    formatNodeBatchFn?: NodeFormatterFunction,
+    parseChoiceSelectAnswerFn?: ChoiceSelectParserFunction,
+    serviceContext?: ServiceContext,
+  ) {
+    this.index = index;
+    this.choiceSelectPrompt = choiceSelectPrompt || defaultChoiceSelectPrompt;
+    this.choiceBatchSize = choiceBatchSize;
+    this.formatNodeBatchFn = formatNodeBatchFn || defaultFormatNodeBatchFn;
+    this.parseChoiceSelectAnswerFn =
+      parseChoiceSelectAnswerFn || defaultParseChoiceSelectAnswerFn;
+    this.serviceContext = serviceContext || index.serviceContext;
+  }
+
+  async retrieve(query: string, parentEvent?: Event): Promise<NodeWithScore[]> {
+    const nodeIds = this.index.indexStruct.nodes;
+    const results: NodeWithScore[] = [];
+
+    for (let idx = 0; idx < nodeIds.length; idx += this.choiceBatchSize) {
+      const nodeIdsBatch = nodeIds.slice(idx, idx + this.choiceBatchSize);
+      const nodesBatch = await this.index.docStore.getNodes(nodeIdsBatch);
+
+      const fmtBatchStr = this.formatNodeBatchFn(nodesBatch);
+      const input = { context: fmtBatchStr, query: query };
+      const rawResponse = (
+        await this.serviceContext.llm.complete({
+          prompt: this.choiceSelectPrompt(input),
+        })
+      ).text;
+
+      // parseResult is a map from doc number to relevance score
+      const parseResult = this.parseChoiceSelectAnswerFn(
+        rawResponse,
+        nodesBatch.length,
+      );
+      const choiceNodeIds = nodeIdsBatch.filter((nodeId, idx) => {
+        return `${idx}` in parseResult;
+      });
+
+      const choiceNodes = await this.index.docStore.getNodes(choiceNodeIds);
+      const nodeWithScores = choiceNodes.map((node, i) => ({
+        node: node,
+        score: _.get(parseResult, `${i + 1}`, 1),
+      }));
+
+      results.push(...nodeWithScores);
+    }
+
+    if (this.serviceContext.callbackManager.onRetrieve) {
+      this.serviceContext.callbackManager.onRetrieve({
+        query,
+        nodes: results,
+        event: globalsHelper.createEvent({
+          parentEvent,
+          type: "retrieve",
+        }),
+      });
+    }
+
+    return results;
+  }
+
+  getServiceContext(): ServiceContext {
+    return this.serviceContext;
+  }
+}
+
+// Legacy
+export type ListIndexRetriever = SummaryIndexRetriever;
+export type ListIndexLLMRetriever = SummaryIndexLLMRetriever;
diff --git a/packages/core/src/indices/summary/utils.ts b/packages/core/src/indices/summary/utils.ts
index af008c42197ced3a2e238d9aa1907073a1afccc7..7805b991fe5e0d044c7b2976751c023ace268393 100644
--- a/packages/core/src/indices/summary/utils.ts
+++ b/packages/core/src/indices/summary/utils.ts
@@ -1,5 +1,5 @@
 import _ from "lodash";
-import { BaseNode, MetadataMode } from "../../Node";
+import { BaseNode, MetadataMode } from "../../Node.js";
 
 export type NodeFormatterFunction = (summaryNodes: BaseNode[]) => string;
 export const defaultFormatNodeBatchFn: NodeFormatterFunction = (
diff --git a/packages/core/src/indices/vectorStore/VectorIndexRetriever.ts b/packages/core/src/indices/vectorStore/VectorIndexRetriever.ts
deleted file mode 100644
index 5a8e3614fd428907d511ace1d22685c0abf21617..0000000000000000000000000000000000000000
--- a/packages/core/src/indices/vectorStore/VectorIndexRetriever.ts
+++ /dev/null
@@ -1,149 +0,0 @@
-import { globalsHelper } from "../../GlobalsHelper";
-import { ImageNode, Metadata, NodeWithScore } from "../../Node";
-import { BaseRetriever } from "../../Retriever";
-import { ServiceContext } from "../../ServiceContext";
-import { Event } from "../../callbacks/CallbackManager";
-import { DEFAULT_SIMILARITY_TOP_K } from "../../constants";
-import { BaseEmbedding } from "../../embeddings";
-import {
-  MetadataFilters,
-  VectorStoreQuery,
-  VectorStoreQueryMode,
-  VectorStoreQueryResult,
-} from "../../storage/vectorStore/types";
-import { VectorStoreIndex } from "./VectorStoreIndex";
-
-/**
- * VectorIndexRetriever retrieves nodes from a VectorIndex.
- */
-
-export type VectorIndexRetrieverOptions = {
-  index: VectorStoreIndex;
-  similarityTopK?: number;
-  imageSimilarityTopK?: number;
-};
-
-export class VectorIndexRetriever implements BaseRetriever {
-  index: VectorStoreIndex;
-  similarityTopK: number;
-  imageSimilarityTopK: number;
-  private serviceContext: ServiceContext;
-
-  constructor({
-    index,
-    similarityTopK,
-    imageSimilarityTopK,
-  }: VectorIndexRetrieverOptions) {
-    this.index = index;
-    this.serviceContext = this.index.serviceContext;
-    this.similarityTopK = similarityTopK ?? DEFAULT_SIMILARITY_TOP_K;
-    this.imageSimilarityTopK = imageSimilarityTopK ?? DEFAULT_SIMILARITY_TOP_K;
-  }
-
-  async retrieve(
-    query: string,
-    parentEvent?: Event,
-    preFilters?: MetadataFilters,
-  ): Promise<NodeWithScore[]> {
-    let nodesWithScores = await this.textRetrieve(query, preFilters);
-    nodesWithScores = nodesWithScores.concat(
-      await this.textToImageRetrieve(query, preFilters),
-    );
-    this.sendEvent(query, nodesWithScores, parentEvent);
-    return nodesWithScores;
-  }
-
-  protected async textRetrieve(
-    query: string,
-    preFilters?: MetadataFilters,
-  ): Promise<NodeWithScore[]> {
-    const options = {};
-    const q = await this.buildVectorStoreQuery(
-      this.index.embedModel,
-      query,
-      this.similarityTopK,
-      preFilters,
-    );
-    const result = await this.index.vectorStore.query(q, options);
-    return this.buildNodeListFromQueryResult(result);
-  }
-
-  private async textToImageRetrieve(
-    query: string,
-    preFilters?: MetadataFilters,
-  ) {
-    if (!this.index.imageEmbedModel || !this.index.imageVectorStore) {
-      // no-op if image embedding and vector store are not set
-      return [];
-    }
-    const q = await this.buildVectorStoreQuery(
-      this.index.imageEmbedModel,
-      query,
-      this.imageSimilarityTopK,
-      preFilters,
-    );
-    const result = await this.index.imageVectorStore.query(q, preFilters);
-    return this.buildNodeListFromQueryResult(result);
-  }
-
-  protected sendEvent(
-    query: string,
-    nodesWithScores: NodeWithScore<Metadata>[],
-    parentEvent: Event | undefined,
-  ) {
-    if (this.serviceContext.callbackManager.onRetrieve) {
-      this.serviceContext.callbackManager.onRetrieve({
-        query,
-        nodes: nodesWithScores,
-        event: globalsHelper.createEvent({
-          parentEvent,
-          type: "retrieve",
-        }),
-      });
-    }
-  }
-
-  protected async buildVectorStoreQuery(
-    embedModel: BaseEmbedding,
-    query: string,
-    similarityTopK: number,
-    preFilters?: MetadataFilters,
-  ): Promise<VectorStoreQuery> {
-    const queryEmbedding = await embedModel.getQueryEmbedding(query);
-
-    return {
-      queryEmbedding: queryEmbedding,
-      mode: VectorStoreQueryMode.DEFAULT,
-      similarityTopK: similarityTopK,
-      filters: preFilters ?? undefined,
-    };
-  }
-
-  protected buildNodeListFromQueryResult(result: VectorStoreQueryResult) {
-    const nodesWithScores: NodeWithScore[] = [];
-    for (let i = 0; i < result.ids.length; i++) {
-      const nodeFromResult = result.nodes?.[i];
-      if (!this.index.indexStruct.nodesDict[result.ids[i]] && nodeFromResult) {
-        this.index.indexStruct.nodesDict[result.ids[i]] = nodeFromResult;
-      }
-
-      const node = this.index.indexStruct.nodesDict[result.ids[i]];
-      // XXX: Hack, if it's an image node, we reconstruct the image from the URL
-      // Alternative: Store image in doc store and retrieve it here
-      if (node instanceof ImageNode) {
-        node.image = node.getUrl();
-      }
-
-      nodesWithScores.push({
-        node: node,
-        score: result.similarities[i],
-      });
-    }
-
-    return nodesWithScores;
-  }
-
-  getServiceContext(): ServiceContext {
-    return this.serviceContext;
-  }
-}
diff --git a/packages/core/src/indices/vectorStore/VectorStoreIndex.ts b/packages/core/src/indices/vectorStore/VectorStoreIndex.ts
deleted file mode 100644
index 5b29ed6ef95d84de2b9ec450a5bd7c1bd7ba4fd3..0000000000000000000000000000000000000000
--- a/packages/core/src/indices/vectorStore/VectorStoreIndex.ts
+++ /dev/null
@@ -1,398 +0,0 @@
-import {
-  BaseNode,
-  Document,
-  ImageNode,
-  MetadataMode,
-  ObjectType,
-  splitNodesByType,
-} from "../../Node";
-import { BaseRetriever } from "../../Retriever";
-import {
-  ServiceContext,
-  serviceContextFromDefaults,
-} from "../../ServiceContext";
-import {
-  BaseEmbedding,
-  ClipEmbedding,
-  MultiModalEmbedding,
-} from "../../embeddings";
-import { RetrieverQueryEngine } from "../../engines/query";
-import { runTransformations } from "../../ingestion";
-import { BaseNodePostprocessor } from "../../postprocessors";
-import {
-  BaseIndexStore,
-  MetadataFilters,
-  StorageContext,
-  VectorStore,
-  storageContextFromDefaults,
-} from "../../storage";
-import { BaseSynthesizer } from "../../synthesizers";
-import { BaseQueryEngine } from "../../types";
-import {
-  BaseIndex,
-  BaseIndexInit,
-  IndexDict,
-  IndexStructType,
-} from "../BaseIndex";
-import {
-  VectorIndexRetriever,
-  VectorIndexRetrieverOptions,
-} from "./VectorIndexRetriever";
-
-interface IndexStructOptions {
-  indexStruct?: IndexDict;
-  indexId?: string;
-}
-export interface VectorIndexOptions extends IndexStructOptions {
-  nodes?: BaseNode[];
-  serviceContext?: ServiceContext;
-  storageContext?: StorageContext;
-  imageVectorStore?: VectorStore;
-  vectorStore?: VectorStore;
-  logProgress?: boolean;
-}
-
-export interface VectorIndexConstructorProps extends BaseIndexInit<IndexDict> {
-  indexStore: BaseIndexStore;
-  imageVectorStore?: VectorStore;
-}
-
-/**
- * The VectorStoreIndex, an index that stores the nodes only according to their vector embedings.
- */
-export class VectorStoreIndex extends BaseIndex<IndexDict> {
-  vectorStore: VectorStore;
-  indexStore: BaseIndexStore;
-  embedModel: BaseEmbedding;
-  imageVectorStore?: VectorStore;
-  imageEmbedModel?: MultiModalEmbedding;
-
-  private constructor(init: VectorIndexConstructorProps) {
-    super(init);
-    this.indexStore = init.indexStore;
-    this.vectorStore = init.vectorStore ?? init.storageContext.vectorStore;
-    this.embedModel = init.serviceContext.embedModel;
-    this.imageVectorStore =
-      init.imageVectorStore ?? init.storageContext.imageVectorStore;
-    if (this.imageVectorStore) {
-      this.imageEmbedModel = new ClipEmbedding();
-    }
-  }
-
-  /**
-   * The async init function creates a new VectorStoreIndex.
-   * @param options
-   * @returns
-   */
-  public static async init(
-    options: VectorIndexOptions,
-  ): Promise<VectorStoreIndex> {
-    const storageContext =
-      options.storageContext ?? (await storageContextFromDefaults({}));
-    const serviceContext =
-      options.serviceContext ?? serviceContextFromDefaults({});
-    const indexStore = storageContext.indexStore;
-    const docStore = storageContext.docStore;
-
-    let indexStruct = await VectorStoreIndex.setupIndexStructFromStorage(
-      indexStore,
-      options,
-    );
-
-    if (!options.nodes && !indexStruct) {
-      throw new Error(
-        "Cannot initialize VectorStoreIndex without nodes or indexStruct",
-      );
-    }
-
-    indexStruct = indexStruct ?? new IndexDict();
-
-    const index = new this({
-      storageContext,
-      serviceContext,
-      docStore,
-      indexStruct,
-      indexStore,
-      vectorStore: options.vectorStore,
-      imageVectorStore: options.imageVectorStore,
-    });
-
-    if (options.nodes) {
-      // If nodes are passed in, then we need to update the index
-      await index.buildIndexFromNodes(options.nodes, {
-        logProgress: options.logProgress,
-      });
-    }
-    return index;
-  }
-
-  private static async setupIndexStructFromStorage(
-    indexStore: BaseIndexStore,
-    options: IndexStructOptions,
-  ) {
-    const indexStructs = (await indexStore.getIndexStructs()) as IndexDict[];
-    let indexStruct: IndexDict | undefined;
-
-    if (options.indexStruct && indexStructs.length > 0) {
-      throw new Error(
-        "Cannot initialize index with both indexStruct and indexStore",
-      );
-    }
-
-    if (options.indexStruct) {
-      indexStruct = options.indexStruct;
-    } else if (indexStructs.length == 1) {
-      indexStruct = indexStructs[0];
-    } else if (indexStructs.length > 1 && options.indexId) {
-      indexStruct = (await indexStore.getIndexStruct(
-        options.indexId,
-      )) as IndexDict;
-    }
-    // Check indexStruct type
-    if (indexStruct && indexStruct.type !== IndexStructType.SIMPLE_DICT) {
-      throw new Error(
-        "Attempting to initialize VectorStoreIndex with non-vector indexStruct",
-      );
-    }
-    return indexStruct;
-  }
-
-  /**
-   * Calculates the embeddings for the given nodes.
-   *
-   * @param nodes - An array of BaseNode objects representing the nodes for which embeddings are to be calculated.
-   * @param {Object} [options] - An optional object containing additional parameters.
-   *   @param {boolean} [options.logProgress] - A boolean indicating whether to log progress to the console (useful for debugging).
-   */
-  async getNodeEmbeddingResults(
-    nodes: BaseNode[],
-    options?: { logProgress?: boolean },
-  ): Promise<BaseNode[]> {
-    const texts = nodes.map((node) => node.getContent(MetadataMode.EMBED));
-    const embeddings = await this.embedModel.getTextEmbeddingsBatch(texts, {
-      logProgress: options?.logProgress,
-    });
-    return nodes.map((node, i) => {
-      node.embedding = embeddings[i];
-      return node;
-    });
-  }
-
-  /**
-   * Get embeddings for nodes and place them into the index.
-   * @param nodes
-   * @returns
-   */
-  async buildIndexFromNodes(
-    nodes: BaseNode[],
-    options?: { logProgress?: boolean },
-  ) {
-    // Check if the index already has nodes with the same hash
-    const newNodes = nodes.filter((node) =>
-      Object.entries(this.indexStruct!.nodesDict).reduce(
-        (acc, [key, value]) => {
-          if (value.hash === node.hash) {
-            acc = false;
-          }
-          return acc;
-        },
-        true,
-      ),
-    );
-
-    await this.insertNodes(newNodes, options);
-  }
-
-  /**
-   * High level API: split documents, get embeddings, and build index.
-   * @param documents
-   * @param args
-   * @returns
-   */
-  static async fromDocuments(
-    documents: Document[],
-    args: VectorIndexOptions = {},
-  ): Promise<VectorStoreIndex> {
-    args.storageContext =
-      args.storageContext ?? (await storageContextFromDefaults({}));
-    args.serviceContext = args.serviceContext ?? serviceContextFromDefaults({});
-    const docStore = args.storageContext.docStore;
-
-    for (const doc of documents) {
-      docStore.setDocumentHash(doc.id_, doc.hash);
-    }
-
-    if (args.logProgress) {
-      console.log("Using node parser on documents...");
-    }
-    args.nodes = await runTransformations(documents, [
-      args.serviceContext.nodeParser,
-    ]);
-    if (args.logProgress) {
-      console.log("Finished parsing documents.");
-    }
-    return await this.init(args);
-  }
-
-  static async fromVectorStore(
-    vectorStore: VectorStore,
-    serviceContext: ServiceContext,
-    imageVectorStore?: VectorStore,
-  ) {
-    if (!vectorStore.storesText) {
-      throw new Error(
-        "Cannot initialize from a vector store that does not store text",
-      );
-    }
-
-    const storageContext = await storageContextFromDefaults({
-      vectorStore,
-      imageVectorStore,
-    });
-
-    const index = await this.init({
-      nodes: [],
-      storageContext,
-      serviceContext,
-    });
-
-    return index;
-  }
-
-  asRetriever(
-    options?: Omit<VectorIndexRetrieverOptions, "index">,
-  ): VectorIndexRetriever {
-    return new VectorIndexRetriever({ index: this, ...options });
-  }
-
-  asQueryEngine(options?: {
-    retriever?: BaseRetriever;
-    responseSynthesizer?: BaseSynthesizer;
-    preFilters?: MetadataFilters;
-    nodePostprocessors?: BaseNodePostprocessor[];
-  }): BaseQueryEngine & RetrieverQueryEngine {
-    const { retriever, responseSynthesizer } = options ?? {};
-    return new RetrieverQueryEngine(
-      retriever ?? this.asRetriever(),
-      responseSynthesizer,
-      options?.preFilters,
-      options?.nodePostprocessors,
-    );
-  }
-
-  protected async insertNodesToStore(
-    vectorStore: VectorStore,
-    nodes: BaseNode[],
-  ): Promise<void> {
-    const newIds = await vectorStore.add(nodes);
-
-    // NOTE: if the vector store doesn't store text,
-    // we need to add the nodes to the index struct and document store
-    // NOTE: if the vector store keeps text,
-    // we only need to add image and index nodes
-    for (let i = 0; i < nodes.length; ++i) {
-      const type = nodes[i].getType();
-      if (
-        !vectorStore.storesText ||
-        type === ObjectType.INDEX ||
-        type === ObjectType.IMAGE
-      ) {
-        const nodeWithoutEmbedding = nodes[i].clone();
-        nodeWithoutEmbedding.embedding = undefined;
-        this.indexStruct.addNode(nodeWithoutEmbedding, newIds[i]);
-        await this.docStore.addDocuments([nodeWithoutEmbedding], true);
-      }
-    }
-  }
-
-  async insertNodes(
-    nodes: BaseNode[],
-    options?: { logProgress?: boolean },
-  ): Promise<void> {
-    if (!nodes || nodes.length === 0) {
-      return;
-    }
-    const { imageNodes, textNodes } = splitNodesByType(nodes);
-    if (imageNodes.length > 0) {
-      if (!this.imageVectorStore) {
-        throw new Error("Cannot insert image nodes without image vector store");
-      }
-      const imageNodesWithEmbedding = await this.getImageNodeEmbeddingResults(
-        imageNodes,
-        options,
-      );
-      await this.insertNodesToStore(
-        this.imageVectorStore,
-        imageNodesWithEmbedding,
-      );
-    }
-    const embeddingResults = await this.getNodeEmbeddingResults(
-      textNodes,
-      options,
-    );
-    await this.insertNodesToStore(this.vectorStore, embeddingResults);
-    await this.indexStore.addIndexStruct(this.indexStruct);
-  }
-
-  async deleteRefDoc(
-    refDocId: string,
-    deleteFromDocStore: boolean = true,
-  ): Promise<void> {
-    await this.deleteRefDocFromStore(this.vectorStore, refDocId);
-    if (this.imageVectorStore) {
-      await this.deleteRefDocFromStore(this.imageVectorStore, refDocId);
-    }
-
-    if (deleteFromDocStore) {
-      await this.docStore.deleteDocument(refDocId, false);
-    }
-  }
-
-  protected async deleteRefDocFromStore(
-    vectorStore: VectorStore,
-    refDocId: string,
-  ): Promise<void> {
-    vectorStore.delete(refDocId);
-
-    if (!vectorStore.storesText) {
-      const refDocInfo = await this.docStore.getRefDocInfo(refDocId);
-
-      if (refDocInfo) {
-        for (const nodeId of refDocInfo.nodeIds) {
-          this.indexStruct.delete(nodeId);
-          vectorStore.delete(nodeId);
-        }
-      }
-      await this.indexStore.addIndexStruct(this.indexStruct);
-    }
-  }
-
-  /**
-   * Calculates the embeddings for the given image nodes.
-   *
-   * @param nodes - An array of ImageNode objects representing the nodes for which embeddings are to be calculated.
-   * @param {Object} [options] - An optional object containing additional parameters.
-   *   @param {boolean} [options.logProgress] - A boolean indicating whether to log progress to the console (useful for debugging).
-   */
-  async getImageNodeEmbeddingResults(
-    nodes: ImageNode[],
-    options?: { logProgress?: boolean },
-  ): Promise<ImageNode[]> {
-    if (!this.imageEmbedModel) {
-      return [];
-    }
-
-    const nodesWithEmbeddings: ImageNode[] = [];
-
-    for (let i = 0; i < nodes.length; ++i) {
-      const node = nodes[i];
-      if (options?.logProgress) {
-        console.log(`Getting embedding for node ${i + 1}/${nodes.length}`);
-      }
-      node.embedding = await this.imageEmbedModel.getImageEmbedding(node.image);
-      nodesWithEmbeddings.push(node);
-    }
-
-    return nodesWithEmbeddings;
-  }
-}
diff --git a/packages/core/src/indices/vectorStore/index.ts b/packages/core/src/indices/vectorStore/index.ts
index a296b4f0b52149a04bef67eedf81e42e3552a273..fd199c5f38b9c1a83359566fcbb8000bbc0203ee 100644
--- a/packages/core/src/indices/vectorStore/index.ts
+++ b/packages/core/src/indices/vectorStore/index.ts
@@ -1,2 +1,533 @@
-export { VectorIndexRetriever } from "./VectorIndexRetriever";
-export { VectorStoreIndex } from "./VectorStoreIndex";
+import { globalsHelper } from "../../GlobalsHelper.js";
+import {
+  BaseNode,
+  Document,
+  ImageNode,
+  Metadata,
+  MetadataMode,
+  NodeWithScore,
+  ObjectType,
+  splitNodesByType,
+} from "../../Node.js";
+import { BaseRetriever } from "../../Retriever.js";
+import {
+  ServiceContext,
+  serviceContextFromDefaults,
+} from "../../ServiceContext.js";
+import { Event } from "../../callbacks/CallbackManager.js";
+import { DEFAULT_SIMILARITY_TOP_K } from "../../constants.js";
+import {
+  BaseEmbedding,
+  ClipEmbedding,
+  MultiModalEmbedding,
+} from "../../embeddings/index.js";
+import { RetrieverQueryEngine } from "../../engines/query/RetrieverQueryEngine.js";
+import { runTransformations } from "../../ingestion/index.js";
+import { BaseNodePostprocessor } from "../../postprocessors/types.js";
+import {
+  BaseIndexStore,
+  MetadataFilters,
+  StorageContext,
+  VectorStore,
+  VectorStoreQuery,
+  VectorStoreQueryMode,
+  VectorStoreQueryResult,
+  storageContextFromDefaults,
+} from "../../storage/index.js";
+import { BaseSynthesizer } from "../../synthesizers/types.js";
+import { BaseQueryEngine } from "../../types.js";
+import { BaseIndex, BaseIndexInit } from "../BaseIndex.js";
+import { IndexDict, IndexStructType } from "../json-to-index-struct.js";
+
+interface IndexStructOptions {
+  indexStruct?: IndexDict;
+  indexId?: string;
+}
+export interface VectorIndexOptions extends IndexStructOptions {
+  nodes?: BaseNode[];
+  serviceContext?: ServiceContext;
+  storageContext?: StorageContext;
+  imageVectorStore?: VectorStore;
+  vectorStore?: VectorStore;
+  logProgress?: boolean;
+}
+
+export interface VectorIndexConstructorProps extends BaseIndexInit<IndexDict> {
+  indexStore: BaseIndexStore;
+  imageVectorStore?: VectorStore;
+}
+
+/**
+ * The VectorStoreIndex, an index that stores the nodes only according to their vector embedings.
+ */
+export class VectorStoreIndex extends BaseIndex<IndexDict> {
+  vectorStore: VectorStore;
+  indexStore: BaseIndexStore;
+  embedModel: BaseEmbedding;
+  imageVectorStore?: VectorStore;
+  imageEmbedModel?: MultiModalEmbedding;
+
+  private constructor(init: VectorIndexConstructorProps) {
+    super(init);
+    this.indexStore = init.indexStore;
+    this.vectorStore = init.vectorStore ?? init.storageContext.vectorStore;
+    this.embedModel = init.serviceContext.embedModel;
+    this.imageVectorStore =
+      init.imageVectorStore ?? init.storageContext.imageVectorStore;
+    if (this.imageVectorStore) {
+      this.imageEmbedModel = new ClipEmbedding();
+    }
+  }
+
+  /**
+   * The async init function creates a new VectorStoreIndex.
+   * @param options
+   * @returns
+   */
+  public static async init(
+    options: VectorIndexOptions,
+  ): Promise<VectorStoreIndex> {
+    const storageContext =
+      options.storageContext ?? (await storageContextFromDefaults({}));
+    const serviceContext =
+      options.serviceContext ?? serviceContextFromDefaults({});
+    const indexStore = storageContext.indexStore;
+    const docStore = storageContext.docStore;
+
+    let indexStruct = await VectorStoreIndex.setupIndexStructFromStorage(
+      indexStore,
+      options,
+    );
+
+    if (!options.nodes && !indexStruct) {
+      throw new Error(
+        "Cannot initialize VectorStoreIndex without nodes or indexStruct",
+      );
+    }
+
+    indexStruct = indexStruct ?? new IndexDict();
+
+    const index = new this({
+      storageContext,
+      serviceContext,
+      docStore,
+      indexStruct,
+      indexStore,
+      vectorStore: options.vectorStore,
+      imageVectorStore: options.imageVectorStore,
+    });
+
+    if (options.nodes) {
+      // If nodes are passed in, then we need to update the index
+      await index.buildIndexFromNodes(options.nodes, {
+        logProgress: options.logProgress,
+      });
+    }
+    return index;
+  }
+
+  private static async setupIndexStructFromStorage(
+    indexStore: BaseIndexStore,
+    options: IndexStructOptions,
+  ) {
+    const indexStructs = (await indexStore.getIndexStructs()) as IndexDict[];
+    let indexStruct: IndexDict | undefined;
+
+    if (options.indexStruct && indexStructs.length > 0) {
+      throw new Error(
+        "Cannot initialize index with both indexStruct and indexStore",
+      );
+    }
+
+    if (options.indexStruct) {
+      indexStruct = options.indexStruct;
+    } else if (indexStructs.length == 1) {
+      indexStruct = indexStructs[0];
+    } else if (indexStructs.length > 1 && options.indexId) {
+      indexStruct = (await indexStore.getIndexStruct(
+        options.indexId,
+      )) as IndexDict;
+    }
+    // Check indexStruct type
+    if (indexStruct && indexStruct.type !== IndexStructType.SIMPLE_DICT) {
+      throw new Error(
+        "Attempting to initialize VectorStoreIndex with non-vector indexStruct",
+      );
+    }
+    return indexStruct;
+  }
+
+  /**
+   * Calculates the embeddings for the given nodes.
+   *
+   * @param nodes - An array of BaseNode objects representing the nodes for which embeddings are to be calculated.
+   * @param {Object} [options] - An optional object containing additional parameters.
+   *   @param {boolean} [options.logProgress] - A boolean indicating whether to log progress to the console (useful for debugging).
+   */
+  async getNodeEmbeddingResults(
+    nodes: BaseNode[],
+    options?: { logProgress?: boolean },
+  ): Promise<BaseNode[]> {
+    const texts = nodes.map((node) => node.getContent(MetadataMode.EMBED));
+    const embeddings = await this.embedModel.getTextEmbeddingsBatch(texts, {
+      logProgress: options?.logProgress,
+    });
+    return nodes.map((node, i) => {
+      node.embedding = embeddings[i];
+      return node;
+    });
+  }
+
+  /**
+   * Get embeddings for nodes and place them into the index.
+   * @param nodes
+   * @returns
+   */
+  async buildIndexFromNodes(
+    nodes: BaseNode[],
+    options?: { logProgress?: boolean },
+  ) {
+    // Check if the index already has nodes with the same hash
+    const newNodes = nodes.filter((node) =>
+      Object.entries(this.indexStruct!.nodesDict).reduce(
+        (acc, [key, value]) => {
+          if (value.hash === node.hash) {
+            acc = false;
+          }
+          return acc;
+        },
+        true,
+      ),
+    );
+
+    await this.insertNodes(newNodes, options);
+  }
+
+  /**
+   * High level API: split documents, get embeddings, and build index.
+   * @param documents
+   * @param args
+   * @returns
+   */
+  static async fromDocuments(
+    documents: Document[],
+    args: VectorIndexOptions = {},
+  ): Promise<VectorStoreIndex> {
+    args.storageContext =
+      args.storageContext ?? (await storageContextFromDefaults({}));
+    args.serviceContext = args.serviceContext ?? serviceContextFromDefaults({});
+    const docStore = args.storageContext.docStore;
+
+    for (const doc of documents) {
+      docStore.setDocumentHash(doc.id_, doc.hash);
+    }
+
+    if (args.logProgress) {
+      console.log("Using node parser on documents...");
+    }
+    args.nodes = await runTransformations(documents, [
+      args.serviceContext.nodeParser,
+    ]);
+    if (args.logProgress) {
+      console.log("Finished parsing documents.");
+    }
+    return await this.init(args);
+  }
+
+  static async fromVectorStore(
+    vectorStore: VectorStore,
+    serviceContext: ServiceContext,
+    imageVectorStore?: VectorStore,
+  ) {
+    if (!vectorStore.storesText) {
+      throw new Error(
+        "Cannot initialize from a vector store that does not store text",
+      );
+    }
+
+    const storageContext = await storageContextFromDefaults({
+      vectorStore,
+      imageVectorStore,
+    });
+
+    const index = await this.init({
+      nodes: [],
+      storageContext,
+      serviceContext,
+    });
+
+    return index;
+  }
+
+  asRetriever(
+    options?: Omit<VectorIndexRetrieverOptions, "index">,
+  ): VectorIndexRetriever {
+    return new VectorIndexRetriever({ index: this, ...options });
+  }
+
+  asQueryEngine(options?: {
+    retriever?: BaseRetriever;
+    responseSynthesizer?: BaseSynthesizer;
+    preFilters?: MetadataFilters;
+    nodePostprocessors?: BaseNodePostprocessor[];
+  }): BaseQueryEngine & RetrieverQueryEngine {
+    const { retriever, responseSynthesizer } = options ?? {};
+    return new RetrieverQueryEngine(
+      retriever ?? this.asRetriever(),
+      responseSynthesizer,
+      options?.preFilters,
+      options?.nodePostprocessors,
+    );
+  }
+
+  protected async insertNodesToStore(
+    vectorStore: VectorStore,
+    nodes: BaseNode[],
+  ): Promise<void> {
+    const newIds = await vectorStore.add(nodes);
+
+    // NOTE: if the vector store doesn't store text,
+    // we need to add the nodes to the index struct and document store
+    // NOTE: if the vector store keeps text,
+    // we only need to add image and index nodes
+    for (let i = 0; i < nodes.length; ++i) {
+      const type = nodes[i].getType();
+      if (
+        !vectorStore.storesText ||
+        type === ObjectType.INDEX ||
+        type === ObjectType.IMAGE
+      ) {
+        const nodeWithoutEmbedding = nodes[i].clone();
+        nodeWithoutEmbedding.embedding = undefined;
+        this.indexStruct.addNode(nodeWithoutEmbedding, newIds[i]);
+        await this.docStore.addDocuments([nodeWithoutEmbedding], true);
+      }
+    }
+  }
+
+  async insertNodes(
+    nodes: BaseNode[],
+    options?: { logProgress?: boolean },
+  ): Promise<void> {
+    if (!nodes || nodes.length === 0) {
+      return;
+    }
+    const { imageNodes, textNodes } = splitNodesByType(nodes);
+    if (imageNodes.length > 0) {
+      if (!this.imageVectorStore) {
+        throw new Error("Cannot insert image nodes without image vector store");
+      }
+      const imageNodesWithEmbedding = await this.getImageNodeEmbeddingResults(
+        imageNodes,
+        options,
+      );
+      await this.insertNodesToStore(
+        this.imageVectorStore,
+        imageNodesWithEmbedding,
+      );
+    }
+    const embeddingResults = await this.getNodeEmbeddingResults(
+      textNodes,
+      options,
+    );
+    await this.insertNodesToStore(this.vectorStore, embeddingResults);
+    await this.indexStore.addIndexStruct(this.indexStruct);
+  }
+
+  async deleteRefDoc(
+    refDocId: string,
+    deleteFromDocStore: boolean = true,
+  ): Promise<void> {
+    await this.deleteRefDocFromStore(this.vectorStore, refDocId);
+    if (this.imageVectorStore) {
+      await this.deleteRefDocFromStore(this.imageVectorStore, refDocId);
+    }
+
+    if (deleteFromDocStore) {
+      await this.docStore.deleteDocument(refDocId, false);
+    }
+  }
+
+  protected async deleteRefDocFromStore(
+    vectorStore: VectorStore,
+    refDocId: string,
+  ): Promise<void> {
+    vectorStore.delete(refDocId);
+
+    if (!vectorStore.storesText) {
+      const refDocInfo = await this.docStore.getRefDocInfo(refDocId);
+
+      if (refDocInfo) {
+        for (const nodeId of refDocInfo.nodeIds) {
+          this.indexStruct.delete(nodeId);
+          vectorStore.delete(nodeId);
+        }
+      }
+      await this.indexStore.addIndexStruct(this.indexStruct);
+    }
+  }
+
+  /**
+   * Calculates the embeddings for the given image nodes.
+   *
+   * @param nodes - An array of ImageNode objects representing the nodes for which embeddings are to be calculated.
+   * @param {Object} [options] - An optional object containing additional parameters.
+   *   @param {boolean} [options.logProgress] - A boolean indicating whether to log progress to the console (useful for debugging).
+   */
+  async getImageNodeEmbeddingResults(
+    nodes: ImageNode[],
+    options?: { logProgress?: boolean },
+  ): Promise<ImageNode[]> {
+    if (!this.imageEmbedModel) {
+      return [];
+    }
+
+    const nodesWithEmbeddings: ImageNode[] = [];
+
+    for (let i = 0; i < nodes.length; ++i) {
+      const node = nodes[i];
+      if (options?.logProgress) {
+        console.log(`Getting embedding for node ${i + 1}/${nodes.length}`);
+      }
+      node.embedding = await this.imageEmbedModel.getImageEmbedding(node.image);
+      nodesWithEmbeddings.push(node);
+    }
+
+    return nodesWithEmbeddings;
+  }
+}
+
+/**
+ * VectorIndexRetriever retrieves nodes from a VectorIndex.
+ */
+
+export type VectorIndexRetrieverOptions = {
+  index: VectorStoreIndex;
+  similarityTopK?: number;
+  imageSimilarityTopK?: number;
+};
+
+export class VectorIndexRetriever implements BaseRetriever {
+  index: VectorStoreIndex;
+  similarityTopK: number;
+  imageSimilarityTopK: number;
+  private serviceContext: ServiceContext;
+
+  constructor({
+    index,
+    similarityTopK,
+    imageSimilarityTopK,
+  }: VectorIndexRetrieverOptions) {
+    this.index = index;
+    this.serviceContext = this.index.serviceContext;
+    this.similarityTopK = similarityTopK ?? DEFAULT_SIMILARITY_TOP_K;
+    this.imageSimilarityTopK = imageSimilarityTopK ?? DEFAULT_SIMILARITY_TOP_K;
+  }
+
+  async retrieve(
+    query: string,
+    parentEvent?: Event,
+    preFilters?: MetadataFilters,
+  ): Promise<NodeWithScore[]> {
+    let nodesWithScores = await this.textRetrieve(query, preFilters);
+    nodesWithScores = nodesWithScores.concat(
+      await this.textToImageRetrieve(query, preFilters),
+    );
+    this.sendEvent(query, nodesWithScores, parentEvent);
+    return nodesWithScores;
+  }
+
+  protected async textRetrieve(
+    query: string,
+    preFilters?: MetadataFilters,
+  ): Promise<NodeWithScore[]> {
+    const options = {};
+    const q = await this.buildVectorStoreQuery(
+      this.index.embedModel,
+      query,
+      this.similarityTopK,
+      preFilters,
+    );
+    const result = await this.index.vectorStore.query(q, options);
+    return this.buildNodeListFromQueryResult(result);
+  }
+
+  private async textToImageRetrieve(
+    query: string,
+    preFilters?: MetadataFilters,
+  ) {
+    if (!this.index.imageEmbedModel || !this.index.imageVectorStore) {
+      // no-op if image embedding and vector store are not set
+      return [];
+    }
+    const q = await this.buildVectorStoreQuery(
+      this.index.imageEmbedModel,
+      query,
+      this.imageSimilarityTopK,
+      preFilters,
+    );
+    const result = await this.index.imageVectorStore.query(q, preFilters);
+    return this.buildNodeListFromQueryResult(result);
+  }
+
+  protected sendEvent(
+    query: string,
+    nodesWithScores: NodeWithScore<Metadata>[],
+    parentEvent: Event | undefined,
+  ) {
+    if (this.serviceContext.callbackManager.onRetrieve) {
+      this.serviceContext.callbackManager.onRetrieve({
+        query,
+        nodes: nodesWithScores,
+        event: globalsHelper.createEvent({
+          parentEvent,
+          type: "retrieve",
+        }),
+      });
+    }
+  }
+
+  protected async buildVectorStoreQuery(
+    embedModel: BaseEmbedding,
+    query: string,
+    similarityTopK: number,
+    preFilters?: MetadataFilters,
+  ): Promise<VectorStoreQuery> {
+    const queryEmbedding = await embedModel.getQueryEmbedding(query);
+
+    return {
+      queryEmbedding: queryEmbedding,
+      mode: VectorStoreQueryMode.DEFAULT,
+      similarityTopK: similarityTopK,
+      filters: preFilters ?? undefined,
+    };
+  }
+
+  protected buildNodeListFromQueryResult(result: VectorStoreQueryResult) {
+    const nodesWithScores: NodeWithScore[] = [];
+    for (let i = 0; i < result.ids.length; i++) {
+      const nodeFromResult = result.nodes?.[i];
+      if (!this.index.indexStruct.nodesDict[result.ids[i]] && nodeFromResult) {
+        this.index.indexStruct.nodesDict[result.ids[i]] = nodeFromResult;
+      }
+
+      const node = this.index.indexStruct.nodesDict[result.ids[i]];
+      // XXX: Hack, if it's an image node, we reconstruct the image from the URL
+      // Alternative: Store image in doc store and retrieve it here
+      if (node instanceof ImageNode) {
+        node.image = node.getUrl();
+      }
+
+      nodesWithScores.push({
+        node: node,
+        score: result.similarities[i],
+      });
+    }
+
+    return nodesWithScores;
+  }
+
+  getServiceContext(): ServiceContext {
+    return this.serviceContext;
+  }
+}
diff --git a/packages/core/src/ingestion/IngestionCache.ts b/packages/core/src/ingestion/IngestionCache.ts
index f35e3f413e5e4af93074848be293d8fb86ef5b2d..e60d4bdff8954f1ff248d5e4ddf94c6447cad260 100644
--- a/packages/core/src/ingestion/IngestionCache.ts
+++ b/packages/core/src/ingestion/IngestionCache.ts
@@ -1,9 +1,9 @@
-import { BaseNode, MetadataMode } from "../Node";
-import { createSHA256 } from "../env";
-import { docToJson, jsonToDoc } from "../storage/docStore/utils";
-import { SimpleKVStore } from "../storage/kvStore/SimpleKVStore";
-import { BaseKVStore } from "../storage/kvStore/types";
-import { TransformComponent } from "./types";
+import { createSHA256 } from "@llamaindex/env";
+import { BaseNode, MetadataMode } from "../Node.js";
+import { docToJson, jsonToDoc } from "../storage/docStore/utils.js";
+import { SimpleKVStore } from "../storage/kvStore/SimpleKVStore.js";
+import { BaseKVStore } from "../storage/kvStore/types.js";
+import { TransformComponent } from "./types.js";
 
 const transformToJSON = (obj: TransformComponent) => {
   const seen: any[] = [];
diff --git a/packages/core/src/ingestion/IngestionPipeline.ts b/packages/core/src/ingestion/IngestionPipeline.ts
index 0a19de26ecb6c3a4120407905ce4da64929196ff..4f846cdb3e6e9da5a7fb2e8937152fa9bc43865a 100644
--- a/packages/core/src/ingestion/IngestionPipeline.ts
+++ b/packages/core/src/ingestion/IngestionPipeline.ts
@@ -1,9 +1,13 @@
-import { BaseNode, Document } from "../Node";
-import { BaseReader } from "../readers/type";
-import { BaseDocumentStore, VectorStore } from "../storage";
-import { IngestionCache, getTransformationHash } from "./IngestionCache";
-import { DocStoreStrategy, createDocStoreStrategy } from "./strategies";
-import { TransformComponent } from "./types";
+import { BaseNode, Document } from "../Node.js";
+import { BaseReader } from "../readers/type.js";
+import { BaseDocumentStore } from "../storage/docStore/types.js";
+import { VectorStore } from "../storage/vectorStore/types.js";
+import { IngestionCache, getTransformationHash } from "./IngestionCache.js";
+import {
+  DocStoreStrategy,
+  createDocStoreStrategy,
+} from "./strategies/index.js";
+import { TransformComponent } from "./types.js";
 
 type IngestionRunArgs = {
   documents?: Document[];
diff --git a/packages/core/src/ingestion/index.ts b/packages/core/src/ingestion/index.ts
index 2e022852ab600faefbb4b6cbcd18b83d1e60cc09..4234d68d9df8c1e9806dcdf673dd292e7e99483a 100644
--- a/packages/core/src/ingestion/index.ts
+++ b/packages/core/src/ingestion/index.ts
@@ -1,2 +1,2 @@
-export * from "./IngestionPipeline";
-export * from "./types";
+export * from "./IngestionPipeline.js";
+export * from "./types.js";
diff --git a/packages/core/src/ingestion/strategies/DuplicatesStrategy.ts b/packages/core/src/ingestion/strategies/DuplicatesStrategy.ts
index d820124fbd20c31a42d7bb9ae1bc84e95616711e..301d7f371fce45da68163bbe3554ef93001a0e30 100644
--- a/packages/core/src/ingestion/strategies/DuplicatesStrategy.ts
+++ b/packages/core/src/ingestion/strategies/DuplicatesStrategy.ts
@@ -1,6 +1,6 @@
-import { BaseNode } from "../../Node";
-import { BaseDocumentStore } from "../../storage";
-import { TransformComponent } from "../types";
+import { BaseNode } from "../../Node.js";
+import { BaseDocumentStore } from "../../storage/docStore/types.js";
+import { TransformComponent } from "../types.js";
 
 /**
  * Handle doc store duplicates by checking all hashes.
diff --git a/packages/core/src/ingestion/strategies/UpsertsAndDeleteStrategy.ts b/packages/core/src/ingestion/strategies/UpsertsAndDeleteStrategy.ts
index ad5c933090433c4539c9a40cdaa1e80e24e65f98..d17b32e1407bc91cfff48c9a40304c9d3b941baf 100644
--- a/packages/core/src/ingestion/strategies/UpsertsAndDeleteStrategy.ts
+++ b/packages/core/src/ingestion/strategies/UpsertsAndDeleteStrategy.ts
@@ -1,6 +1,6 @@
-import { BaseNode } from "../../Node";
-import { BaseDocumentStore, VectorStore } from "../../storage";
-import { classify } from "./classify";
+import { BaseNode } from "../../Node.js";
+import { BaseDocumentStore, VectorStore } from "../../storage/index.js";
+import { classify } from "./classify.js";
 
 /**
  * Handle docstore upserts by checking hashes and ids.
diff --git a/packages/core/src/ingestion/strategies/UpsertsStrategy.ts b/packages/core/src/ingestion/strategies/UpsertsStrategy.ts
index d60fc400854e341573e136bae20693ba5c4d6520..a89ee63b94f28b618dfa20b4a15a4454606f964b 100644
--- a/packages/core/src/ingestion/strategies/UpsertsStrategy.ts
+++ b/packages/core/src/ingestion/strategies/UpsertsStrategy.ts
@@ -1,7 +1,8 @@
-import { BaseNode } from "../../Node";
-import { BaseDocumentStore, VectorStore } from "../../storage";
-import { TransformComponent } from "../types";
-import { classify } from "./classify";
+import { BaseNode } from "../../Node.js";
+import { BaseDocumentStore } from "../../storage/docStore/types.js";
+import { VectorStore } from "../../storage/vectorStore/types.js";
+import { TransformComponent } from "../types.js";
+import { classify } from "./classify.js";
 
 /**
  * Handles doc store upserts by checking hashes and ids.
diff --git a/packages/core/src/ingestion/strategies/classify.ts b/packages/core/src/ingestion/strategies/classify.ts
index a950aade3ef840443fa9a0bd9737212b5110c95c..7ed5d260eda4b01b15a2b36b835f1d35c734a9ef 100644
--- a/packages/core/src/ingestion/strategies/classify.ts
+++ b/packages/core/src/ingestion/strategies/classify.ts
@@ -1,5 +1,5 @@
-import { BaseNode } from "../../Node";
-import { BaseDocumentStore } from "../../storage";
+import { BaseNode } from "../../Node.js";
+import { BaseDocumentStore } from "../../storage/docStore/types.js";
 
 export async function classify(docStore: BaseDocumentStore, nodes: BaseNode[]) {
   const existingDocIds = Object.values(await docStore.getAllDocumentHashes());
diff --git a/packages/core/src/ingestion/strategies/index.ts b/packages/core/src/ingestion/strategies/index.ts
index e4e4f6a4dd1bf7a70d250b49ce27a2fa50f0befc..3c2f01a5a27621ab152c422c474df517cc2883f0 100644
--- a/packages/core/src/ingestion/strategies/index.ts
+++ b/packages/core/src/ingestion/strategies/index.ts
@@ -1,7 +1,8 @@
-import { BaseDocumentStore, VectorStore } from "../../storage";
-import { TransformComponent } from "../types";
-import { DuplicatesStrategy } from "./DuplicatesStrategy";
-import { UpsertsStrategy } from "./UpsertsStrategy";
+import { BaseDocumentStore } from "../../storage/docStore/types.js";
+import { VectorStore } from "../../storage/vectorStore/types.js";
+import { TransformComponent } from "../types.js";
+import { DuplicatesStrategy } from "./DuplicatesStrategy.js";
+import { UpsertsStrategy } from "./UpsertsStrategy.js";
 
 export enum DocStoreStrategy {
   UPSERTS = "upserts",
diff --git a/packages/core/src/ingestion/types.ts b/packages/core/src/ingestion/types.ts
index 55012e57d2fabdde77adb2e5ae23cc017aac9847..6c6f40f5c9f5d954f46346d1474ee07b5280c64e 100644
--- a/packages/core/src/ingestion/types.ts
+++ b/packages/core/src/ingestion/types.ts
@@ -1,4 +1,4 @@
-import { BaseNode } from "../Node";
+import { BaseNode } from "../Node.js";
 
 export interface TransformComponent {
   transform(nodes: BaseNode[], options?: any): Promise<BaseNode[]>;
diff --git a/packages/core/src/llm/LLM.ts b/packages/core/src/llm/LLM.ts
index 95ddd3ee785e39bc53c524ad0e41035bd07bb7a5..0b3f06a9904bbf25c2296b2f0b488f12e7801b50 100644
--- a/packages/core/src/llm/LLM.ts
+++ b/packages/core/src/llm/LLM.ts
@@ -6,28 +6,28 @@ import {
   EventType,
   OpenAIStreamToken,
   StreamCallbackResponse,
-} from "../callbacks/CallbackManager";
+} from "../callbacks/CallbackManager.js";
 
-import { ChatCompletionMessageParam } from "openai/resources";
+import { ChatCompletionMessageParam } from "openai/resources/index.js";
 import { LLMOptions } from "portkey-ai";
-import { Tokenizers, globalsHelper } from "../GlobalsHelper";
+import { Tokenizers, globalsHelper } from "../GlobalsHelper.js";
 import {
   ANTHROPIC_AI_PROMPT,
   ANTHROPIC_HUMAN_PROMPT,
   AnthropicSession,
   getAnthropicSession,
-} from "./anthropic";
+} from "./anthropic.js";
 import {
   AzureOpenAIConfig,
   getAzureBaseUrl,
   getAzureConfigFromEnv,
   getAzureModel,
   shouldUseAzure,
-} from "./azure";
-import { BaseLLM } from "./base";
-import { OpenAISession, getOpenAISession } from "./open_ai";
-import { PortkeySession, getPortkeySession } from "./portkey";
-import { ReplicateSession } from "./replicate_ai";
+} from "./azure.js";
+import { BaseLLM } from "./base.js";
+import { OpenAISession, getOpenAISession } from "./open_ai.js";
+import { PortkeySession, getPortkeySession } from "./portkey.js";
+import { ReplicateSession } from "./replicate_ai.js";
 import {
   ChatMessage,
   ChatResponse,
@@ -36,7 +36,7 @@ import {
   LLMChatParamsStreaming,
   LLMMetadata,
   MessageType,
-} from "./types";
+} from "./types.js";
 
 export const GPT4_MODELS = {
   "gpt-4": { contextWindow: 8192 },
diff --git a/packages/core/src/llm/base.ts b/packages/core/src/llm/base.ts
index 574710b4cd9900e00d5d45ef85518101507d5869..088b6ae822af8de850eb45f650c5ebe7ba860850 100644
--- a/packages/core/src/llm/base.ts
+++ b/packages/core/src/llm/base.ts
@@ -9,8 +9,8 @@ import {
   LLMCompletionParamsNonStreaming,
   LLMCompletionParamsStreaming,
   LLMMetadata,
-} from "./types";
-import { streamConverter } from "./utils";
+} from "./types.js";
+import { streamConverter } from "./utils.js";
 
 export abstract class BaseLLM implements LLM {
   abstract metadata: LLMMetadata;
diff --git a/packages/core/src/llm/fireworks.ts b/packages/core/src/llm/fireworks.ts
index 89bd0796fb499165b6053ed10719b773633e4052..f6ad6b7132f1bf467c1fd67ce5cb88a21a013ec9 100644
--- a/packages/core/src/llm/fireworks.ts
+++ b/packages/core/src/llm/fireworks.ts
@@ -1,4 +1,4 @@
-import { OpenAI } from "./LLM";
+import { OpenAI } from "./LLM.js";
 
 export class FireworksLLM extends OpenAI {
   constructor(init?: Partial<OpenAI>) {
diff --git a/packages/core/src/llm/index.ts b/packages/core/src/llm/index.ts
index 6b62b740c11fa569ab10bb3c807ec434b6b77dbd..10a2dbc1a8f9a8a231d033ea26c76649b48cda87 100644
--- a/packages/core/src/llm/index.ts
+++ b/packages/core/src/llm/index.ts
@@ -1,11 +1,11 @@
-export * from "./LLM";
-export { FireworksLLM } from "./fireworks";
+export * from "./LLM.js";
+export { FireworksLLM } from "./fireworks.js";
 export {
   ALL_AVAILABLE_MISTRAL_MODELS,
   MistralAI,
   MistralAISession,
-} from "./mistral";
-export { Ollama } from "./ollama";
-export * from "./open_ai";
-export { TogetherLLM } from "./together";
-export * from "./types";
+} from "./mistral.js";
+export { Ollama } from "./ollama.js";
+export * from "./open_ai.js";
+export { TogetherLLM } from "./together.js";
+export * from "./types.js";
diff --git a/packages/core/src/llm/mistral.ts b/packages/core/src/llm/mistral.ts
index 61b979b740a9cf6aade2306cc825a47dcd23dd74..c4aa37368d2f2b2f77506740c6f0b9a82f74661d 100644
--- a/packages/core/src/llm/mistral.ts
+++ b/packages/core/src/llm/mistral.ts
@@ -3,15 +3,15 @@ import {
   Event,
   EventType,
   StreamCallbackResponse,
-} from "../callbacks/CallbackManager";
-import { BaseLLM } from "./base";
+} from "../callbacks/CallbackManager.js";
+import { BaseLLM } from "./base.js";
 import {
   ChatMessage,
   ChatResponse,
   ChatResponseChunk,
   LLMChatParamsNonStreaming,
   LLMChatParamsStreaming,
-} from "./types";
+} from "./types.js";
 
 export const ALL_AVAILABLE_MISTRAL_MODELS = {
   "mistral-tiny": { contextWindow: 32000 },
diff --git a/packages/core/src/llm/ollama.ts b/packages/core/src/llm/ollama.ts
index 4f292290875398bc40764e248355feaa1f81482d..070320932281cf2b7ce2c85d58b8c4f2ab8a35f3 100644
--- a/packages/core/src/llm/ollama.ts
+++ b/packages/core/src/llm/ollama.ts
@@ -1,6 +1,6 @@
-import { CallbackManager, Event } from "../callbacks/CallbackManager";
-import { BaseEmbedding } from "../embeddings/types";
-import { ok } from "../env";
+import { ok } from "@llamaindex/env";
+import { CallbackManager, Event } from "../callbacks/CallbackManager.js";
+import { BaseEmbedding } from "../embeddings/types.js";
 import {
   ChatMessage,
   ChatResponse,
@@ -12,7 +12,7 @@ import {
   LLMCompletionParamsNonStreaming,
   LLMCompletionParamsStreaming,
   LLMMetadata,
-} from "./types";
+} from "./types.js";
 
 const messageAccessor = (data: any): ChatResponseChunk => {
   return {
diff --git a/packages/core/src/llm/together.ts b/packages/core/src/llm/together.ts
index 94928e251b023c4e41508c8e6117947abe27e86b..96df3cef870e7fda19e419d87bcd18db0a9a37bc 100644
--- a/packages/core/src/llm/together.ts
+++ b/packages/core/src/llm/together.ts
@@ -1,4 +1,4 @@
-import { OpenAI } from "./LLM";
+import { OpenAI } from "./LLM.js";
 
 export class TogetherLLM extends OpenAI {
   constructor(init?: Partial<OpenAI>) {
diff --git a/packages/core/src/llm/types.ts b/packages/core/src/llm/types.ts
index 305769f83d22f893fd6ea3aec411ccc0da927c96..f5bfa56694171dd3c2830f40d8806a5062062fda 100644
--- a/packages/core/src/llm/types.ts
+++ b/packages/core/src/llm/types.ts
@@ -1,5 +1,5 @@
-import { Tokenizers } from "../GlobalsHelper";
-import { Event } from "../callbacks/CallbackManager";
+import { Tokenizers } from "../GlobalsHelper.js";
+import { Event } from "../callbacks/CallbackManager.js";
 
 /**
  * Unified language model interface
diff --git a/packages/core/src/llm/utils.ts b/packages/core/src/llm/utils.ts
index 39bf27ba329de416a561cafcafa618a5ace946de..b6c9869902e93ea5bb04580c2d4111a779e4ffb0 100644
--- a/packages/core/src/llm/utils.ts
+++ b/packages/core/src/llm/utils.ts
@@ -1,4 +1,4 @@
-import { MessageContent, MessageContentDetail } from "./types";
+import { MessageContent, MessageContentDetail } from "./types.js";
 
 export async function* streamConverter<S, D>(
   stream: AsyncIterable<S>,
diff --git a/packages/core/src/memory/ChatMemoryBuffer.ts b/packages/core/src/memory/ChatMemoryBuffer.ts
index 72036336b5394e98fec322adf72270b247a788da..32cae371e1956e476cc66ee751f28d002cbca53e 100644
--- a/packages/core/src/memory/ChatMemoryBuffer.ts
+++ b/packages/core/src/memory/ChatMemoryBuffer.ts
@@ -1,7 +1,7 @@
-import { ChatMessage } from "../llm";
-import { SimpleChatStore } from "../storage/chatStore/SimpleChatStore";
-import { BaseChatStore } from "../storage/chatStore/types";
-import { BaseMemory } from "./types";
+import { ChatMessage } from "../llm/index.js";
+import { SimpleChatStore } from "../storage/chatStore/SimpleChatStore.js";
+import { BaseChatStore } from "../storage/chatStore/types.js";
+import { BaseMemory } from "./types.js";
 
 type ChatMemoryBufferParams = {
   tokenLimit?: number;
diff --git a/packages/core/src/memory/types.ts b/packages/core/src/memory/types.ts
index 2222599abb71d73c4f2355982ab07b005762fc90..93d38496deafdea2b626af8dade0c1cf9d376c75 100644
--- a/packages/core/src/memory/types.ts
+++ b/packages/core/src/memory/types.ts
@@ -1,7 +1,7 @@
-import { ChatMessage } from "../llm";
+import { ChatMessage } from "../llm/index.js";
 
 export interface BaseMemory {
-  /* 
+  /*
    Get chat history.
   */
   get(...args: any): ChatMessage[];
diff --git a/packages/core/src/nodeParsers/MarkdownNodeParser.ts b/packages/core/src/nodeParsers/MarkdownNodeParser.ts
index 249bd12c8e5e4549a33bf19adbd92f113c6c4cc3..a6fbb2f772f3bcddf77fb0b54e0a7bd991001c25 100644
--- a/packages/core/src/nodeParsers/MarkdownNodeParser.ts
+++ b/packages/core/src/nodeParsers/MarkdownNodeParser.ts
@@ -1,5 +1,5 @@
-import { BaseNode, Metadata, MetadataMode, TextNode } from "../Node";
-import { NodeParser } from "./types";
+import { BaseNode, Metadata, MetadataMode, TextNode } from "../Node.js";
+import { NodeParser } from "./types.js";
 
 export class MarkdownNodeParser implements NodeParser {
   includeMetadata: boolean;
diff --git a/packages/core/src/nodeParsers/SentenceWindowNodeParser.ts b/packages/core/src/nodeParsers/SentenceWindowNodeParser.ts
index aca0318732df5914c51688cb9edb750d8f3691bb..ac7009a1983148535985009142ebb5f2d9c5886a 100644
--- a/packages/core/src/nodeParsers/SentenceWindowNodeParser.ts
+++ b/packages/core/src/nodeParsers/SentenceWindowNodeParser.ts
@@ -1,7 +1,7 @@
-import { BaseNode } from "../Node";
-import { SentenceSplitter } from "../TextSplitter";
-import { NodeParser } from "./types";
-import { getNodesFromDocument } from "./utils";
+import { BaseNode } from "../Node.js";
+import { SentenceSplitter } from "../TextSplitter.js";
+import { NodeParser } from "./types.js";
+import { getNodesFromDocument } from "./utils.js";
 
 export const DEFAULT_WINDOW_SIZE = 3;
 export const DEFAULT_WINDOW_METADATA_KEY = "window";
diff --git a/packages/core/src/nodeParsers/SimpleNodeParser.ts b/packages/core/src/nodeParsers/SimpleNodeParser.ts
index baa5cc20e2b9f2d29a0cf25f91523e4b4d26b397..8418c4e87a75ab9bee4fd884c8b80b166dec7b16 100644
--- a/packages/core/src/nodeParsers/SimpleNodeParser.ts
+++ b/packages/core/src/nodeParsers/SimpleNodeParser.ts
@@ -1,8 +1,8 @@
-import { BaseNode } from "../Node";
-import { SentenceSplitter } from "../TextSplitter";
-import { DEFAULT_CHUNK_OVERLAP, DEFAULT_CHUNK_SIZE } from "../constants";
-import { NodeParser } from "./types";
-import { getNodesFromDocument } from "./utils";
+import { BaseNode } from "../Node.js";
+import { SentenceSplitter } from "../TextSplitter.js";
+import { DEFAULT_CHUNK_OVERLAP, DEFAULT_CHUNK_SIZE } from "../constants.js";
+import { NodeParser } from "./types.js";
+import { getNodesFromDocument } from "./utils.js";
 
 /**
  * SimpleNodeParser is the default NodeParser. It splits documents into TextNodes using a splitter, by default SentenceSplitter
diff --git a/packages/core/src/nodeParsers/index.ts b/packages/core/src/nodeParsers/index.ts
index e1ef8f7c5ced0bebb2715bdf9d8a3a317ea28db2..083fc4a55bea2d26811d781b8dc0982d7abf8935 100644
--- a/packages/core/src/nodeParsers/index.ts
+++ b/packages/core/src/nodeParsers/index.ts
@@ -1,4 +1,4 @@
-export * from "./MarkdownNodeParser";
-export * from "./SentenceWindowNodeParser";
-export * from "./SimpleNodeParser";
-export * from "./types";
+export * from "./MarkdownNodeParser.js";
+export * from "./SentenceWindowNodeParser.js";
+export * from "./SimpleNodeParser.js";
+export * from "./types.js";
diff --git a/packages/core/src/nodeParsers/types.ts b/packages/core/src/nodeParsers/types.ts
index 47375212d5330fa4f788a7f20cdd6d97c692ac57..ef894f563c5877bf8158dd248de9473bbb48622d 100644
--- a/packages/core/src/nodeParsers/types.ts
+++ b/packages/core/src/nodeParsers/types.ts
@@ -1,5 +1,5 @@
-import { BaseNode } from "../Node";
-import { TransformComponent } from "../ingestion";
+import { BaseNode } from "../Node.js";
+import { TransformComponent } from "../ingestion/types.js";
 
 /**
  * A NodeParser generates Nodes from Documents
diff --git a/packages/core/src/nodeParsers/utils.ts b/packages/core/src/nodeParsers/utils.ts
index c6e325ba7ef7ef74b1ddc7b2eab0f3af45191694..235401ea412b2a5db84fb6632291057726f6df39 100644
--- a/packages/core/src/nodeParsers/utils.ts
+++ b/packages/core/src/nodeParsers/utils.ts
@@ -5,7 +5,7 @@ import {
   ImageDocument,
   NodeRelationship,
   TextNode,
-} from "../Node";
+} from "../Node.js";
 
 type TextSplitter = (s: string) => string[];
 
diff --git a/packages/core/src/objects/base.ts b/packages/core/src/objects/base.ts
index db39e2f92a7fec6aa6345db85ed126d4bb1f9bda..44088ca624a77cd44ad0f474ef09edd564d1f262 100644
--- a/packages/core/src/objects/base.ts
+++ b/packages/core/src/objects/base.ts
@@ -1,7 +1,7 @@
-import { BaseNode, Metadata, TextNode } from "../Node";
-import { BaseRetriever } from "../Retriever";
-import { VectorStoreIndex } from "../indices";
-import { BaseTool } from "../types";
+import { BaseNode, Metadata, TextNode } from "../Node.js";
+import { BaseRetriever } from "../Retriever.js";
+import { VectorStoreIndex } from "../indices/index.js";
+import { BaseTool } from "../types.js";
 
 // Assuming that necessary interfaces and classes (like OT, TextNode, BaseNode, etc.) are defined elsewhere
 // Import statements (e.g., for TextNode, BaseNode) should be added based on your project's structure
diff --git a/packages/core/src/objects/index.ts b/packages/core/src/objects/index.ts
index 955fdd14398fe62365b8ce88feeb7cac6272d3e3..261d80f0284b88d9d16ec51a8edf8c312f708921 100644
--- a/packages/core/src/objects/index.ts
+++ b/packages/core/src/objects/index.ts
@@ -1 +1 @@
-export * from "./base";
+export * from "./base.js";
diff --git a/packages/core/src/outputParsers/selectors.ts b/packages/core/src/outputParsers/selectors.ts
index 9c0af07e271d3c54e227bdcf688886e02996dabd..2d89882ae103103d1e2f49da891aae71364d881c 100644
--- a/packages/core/src/outputParsers/selectors.ts
+++ b/packages/core/src/outputParsers/selectors.ts
@@ -1,5 +1,5 @@
-import { parseJsonMarkdown } from "../OutputParser";
-import { BaseOutputParser, StructuredOutput } from "../types";
+import { parseJsonMarkdown } from "../OutputParser.js";
+import { BaseOutputParser, StructuredOutput } from "../types.js";
 
 export type Answer = {
   choice: number;
diff --git a/packages/core/src/postprocessors/MetadataReplacementPostProcessor.ts b/packages/core/src/postprocessors/MetadataReplacementPostProcessor.ts
index c15e3971801b45ca37f7ee9d1e4e46568b8ccc23..13440807514533ceb6f858aaa71c42f5884d2c15 100644
--- a/packages/core/src/postprocessors/MetadataReplacementPostProcessor.ts
+++ b/packages/core/src/postprocessors/MetadataReplacementPostProcessor.ts
@@ -1,5 +1,5 @@
-import { MetadataMode, NodeWithScore } from "../Node";
-import { BaseNodePostprocessor } from "./types";
+import { MetadataMode, NodeWithScore } from "../Node.js";
+import { BaseNodePostprocessor } from "./types.js";
 
 export class MetadataReplacementPostProcessor implements BaseNodePostprocessor {
   targetMetadataKey: string;
diff --git a/packages/core/src/postprocessors/SimilarityPostprocessor.ts b/packages/core/src/postprocessors/SimilarityPostprocessor.ts
index 413fa922952a431be338cc0a45b19543347e4db4..60db9501e2b819161ecf3a553621e9551ebc86fc 100644
--- a/packages/core/src/postprocessors/SimilarityPostprocessor.ts
+++ b/packages/core/src/postprocessors/SimilarityPostprocessor.ts
@@ -1,5 +1,5 @@
-import { NodeWithScore } from "../Node";
-import { BaseNodePostprocessor } from "./types";
+import { NodeWithScore } from "../Node.js";
+import { BaseNodePostprocessor } from "./types.js";
 
 export class SimilarityPostprocessor implements BaseNodePostprocessor {
   similarityCutoff?: number;
diff --git a/packages/core/src/postprocessors/index.ts b/packages/core/src/postprocessors/index.ts
index 3e52ee40c1ca93b19e545a95ec251008e96d414d..0cf848c05287e2ab23c738b46afcac0f98100106 100644
--- a/packages/core/src/postprocessors/index.ts
+++ b/packages/core/src/postprocessors/index.ts
@@ -1,4 +1,4 @@
-export * from "./MetadataReplacementPostProcessor";
-export * from "./SimilarityPostprocessor";
-export * from "./rerankers";
-export * from "./types";
+export * from "./MetadataReplacementPostProcessor.js";
+export * from "./SimilarityPostprocessor.js";
+export * from "./rerankers/index.js";
+export * from "./types.js";
diff --git a/packages/core/src/postprocessors/rerankers/CohereRerank.ts b/packages/core/src/postprocessors/rerankers/CohereRerank.ts
index 44d4e9f7a2d29f1fb82cb18c51975fcb48112240..b10579e160ca800d76c688c2ce215ba06cd70a74 100644
--- a/packages/core/src/postprocessors/rerankers/CohereRerank.ts
+++ b/packages/core/src/postprocessors/rerankers/CohereRerank.ts
@@ -1,7 +1,7 @@
 import { CohereClient } from "cohere-ai";
 
-import { MetadataMode, NodeWithScore } from "../../Node";
-import { BaseNodePostprocessor } from "../types";
+import { MetadataMode, NodeWithScore } from "../../Node.js";
+import { BaseNodePostprocessor } from "../types.js";
 
 type CohereRerankOptions = {
   topN?: number;
diff --git a/packages/core/src/postprocessors/rerankers/index.ts b/packages/core/src/postprocessors/rerankers/index.ts
index 8ef81bdb87e098e191e8c1e8cbedcd7a7822ddff..d0e25d18237751ec6413f23dd972a85ae7b23401 100644
--- a/packages/core/src/postprocessors/rerankers/index.ts
+++ b/packages/core/src/postprocessors/rerankers/index.ts
@@ -1 +1 @@
-export * from "./CohereRerank";
+export * from "./CohereRerank.js";
diff --git a/packages/core/src/postprocessors/types.ts b/packages/core/src/postprocessors/types.ts
index deedc0ceeedff5f82dd850cb1ea90115c591e935..7a0c0617b259c1296d0f61c57974ad4f04c7ba7a 100644
--- a/packages/core/src/postprocessors/types.ts
+++ b/packages/core/src/postprocessors/types.ts
@@ -1,4 +1,4 @@
-import { NodeWithScore } from "../Node";
+import { NodeWithScore } from "../Node.js";
 
 export interface BaseNodePostprocessor {
   /**
diff --git a/packages/core/src/prompts/index.ts b/packages/core/src/prompts/index.ts
index fb7823314cd60123bade0d4203083942dc1be078..958a2b0f3c3b5e5db9a30d5e8adfff4ad03f11ea 100644
--- a/packages/core/src/prompts/index.ts
+++ b/packages/core/src/prompts/index.ts
@@ -1 +1 @@
-export * from "./Mixin";
+export * from "./Mixin.js";
diff --git a/packages/core/src/readers/AssemblyAIReader.ts b/packages/core/src/readers/AssemblyAIReader.ts
index 4e45ba866c34006d8f6f75322aa40ed18ed7333b..8418d82df4570c7d38eee8dbe6b2d871b1e097af 100644
--- a/packages/core/src/readers/AssemblyAIReader.ts
+++ b/packages/core/src/readers/AssemblyAIReader.ts
@@ -6,8 +6,8 @@ import {
   TranscriptParagraph,
   TranscriptSentence,
 } from "assemblyai";
-import { Document } from "../Node";
-import { BaseReader } from "./type";
+import { Document } from "../Node.js";
+import { BaseReader } from "./type.js";
 
 type AssemblyAIOptions = Partial<BaseServiceParams>;
 
diff --git a/packages/core/src/readers/CSVReader.ts b/packages/core/src/readers/CSVReader.ts
index 6645da0184620ae6e802255e4b50d2eb4f030780..949de974fe3f3d89597e5788bfe08318728b4d46 100644
--- a/packages/core/src/readers/CSVReader.ts
+++ b/packages/core/src/readers/CSVReader.ts
@@ -1,8 +1,8 @@
+import { defaultFS } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
 import Papa, { ParseConfig } from "papaparse";
-import { Document } from "../Node";
-import { defaultFS } from "../env";
-import { GenericFileSystem } from "../storage/FileSystem";
-import { FileReader } from "./type";
+import { Document } from "../Node.js";
+import { FileReader } from "./type.js";
 
 /**
  * papaparse-based csv parser
diff --git a/packages/core/src/readers/DocxReader.ts b/packages/core/src/readers/DocxReader.ts
index 1dc2fe2d44d4616bf345b3669a5ff557fd48fde1..0af3e33e6d1abe55ad11bb2b9cdfebecf12cafd4 100644
--- a/packages/core/src/readers/DocxReader.ts
+++ b/packages/core/src/readers/DocxReader.ts
@@ -1,8 +1,8 @@
+import { defaultFS } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
 import mammoth from "mammoth";
-import { Document } from "../Node";
-import { defaultFS } from "../env";
-import { GenericFileSystem } from "../storage/FileSystem";
-import { FileReader } from "./type";
+import { Document } from "../Node.js";
+import { FileReader } from "./type.js";
 
 export class DocxReader implements FileReader {
   /** DocxParser */
diff --git a/packages/core/src/readers/HTMLReader.ts b/packages/core/src/readers/HTMLReader.ts
index df52a43d995b0b6b99acf005c42dee4fbf0ee697..ce53287f3340b9ebcf24c990409c47f353e7d6ef 100644
--- a/packages/core/src/readers/HTMLReader.ts
+++ b/packages/core/src/readers/HTMLReader.ts
@@ -1,7 +1,7 @@
-import { Document } from "../Node";
-import { defaultFS } from "../env";
-import { GenericFileSystem } from "../storage/FileSystem";
-import { FileReader } from "./type";
+import { defaultFS } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
+import { Document } from "../Node.js";
+import { FileReader } from "./type.js";
 
 /**
  * Extract the significant text from an arbitrary HTML document.
diff --git a/packages/core/src/readers/ImageReader.ts b/packages/core/src/readers/ImageReader.ts
index 9a482376adf011aac5f939be6bcfbf018a615f0e..ea653697d6f9f95a82c6c567fcbeb3c7aee4bb9e 100644
--- a/packages/core/src/readers/ImageReader.ts
+++ b/packages/core/src/readers/ImageReader.ts
@@ -1,7 +1,7 @@
-import { Document, ImageDocument } from "../Node";
-import { defaultFS } from "../env";
-import { GenericFileSystem } from "../storage/FileSystem";
-import { FileReader } from "./type";
+import { defaultFS } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
+import { Document, ImageDocument } from "../Node.js";
+import { FileReader } from "./type.js";
 
 /**
  * Reads the content of an image file into a Document object (which stores the image file as a Blob).
diff --git a/packages/core/src/readers/LlamaParseReader.ts b/packages/core/src/readers/LlamaParseReader.ts
index 8055f555a8635da3bd0eaf828b61185390adfa14..3f671e710f34c169a24f8a224a0268c178678f46 100644
--- a/packages/core/src/readers/LlamaParseReader.ts
+++ b/packages/core/src/readers/LlamaParseReader.ts
@@ -1,7 +1,7 @@
-import { Document } from "../Node";
-import { defaultFS } from "../env";
-import { GenericFileSystem } from "../storage/FileSystem";
-import { FileReader } from "./type";
+import { defaultFS } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
+import { Document } from "../Node.js";
+import { FileReader } from "./type.js";
 
 type ResultType = "text" | "markdown";
 
diff --git a/packages/core/src/readers/MarkdownReader.ts b/packages/core/src/readers/MarkdownReader.ts
index 907c78bbf5f278e49883acc9f5f6a4496ede88c1..7b0ffdbaf49609b0b2479fd8bc818b66add223ef 100644
--- a/packages/core/src/readers/MarkdownReader.ts
+++ b/packages/core/src/readers/MarkdownReader.ts
@@ -1,7 +1,7 @@
-import { Document } from "../Node";
-import { defaultFS } from "../env";
-import { GenericFileSystem } from "../storage";
-import { FileReader } from "./type";
+import { defaultFS } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
+import { Document } from "../Node.js";
+import { FileReader } from "./type.js";
 
 type MarkdownTuple = [string | null, string];
 
diff --git a/packages/core/src/readers/NotionReader.ts b/packages/core/src/readers/NotionReader.ts
index 30df5e6e54c0f4e68912d98c914540a0b408209d..7422e42b1181d0d11e9b352cdab9293cbf4bbe69 100644
--- a/packages/core/src/readers/NotionReader.ts
+++ b/packages/core/src/readers/NotionReader.ts
@@ -1,7 +1,7 @@
 import { Client } from "@notionhq/client";
 import { crawler, Crawler, Pages, pageToString } from "notion-md-crawler";
-import { Document } from "../Node";
-import { BaseReader } from "./type";
+import { Document } from "../Node.js";
+import { BaseReader } from "./type.js";
 
 type OptionalSerializers = Parameters<Crawler>[number]["serializers"];
 
diff --git a/packages/core/src/readers/PDFReader.ts b/packages/core/src/readers/PDFReader.ts
index d900dc1c4487d5ab75708d438d05b7f64bac8a5d..0df5ebf7e620df611eb0797d0ce0849965beb021 100644
--- a/packages/core/src/readers/PDFReader.ts
+++ b/packages/core/src/readers/PDFReader.ts
@@ -1,7 +1,7 @@
-import { Document } from "../Node";
-import { createSHA256, defaultFS } from "../env";
-import { GenericFileSystem } from "../storage/FileSystem";
-import { BaseReader } from "./type";
+import { createSHA256, defaultFS } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
+import { Document } from "../Node.js";
+import { BaseReader } from "./type.js";
 
 /**
  * Read the text of a PDF
diff --git a/packages/core/src/readers/SimpleDirectoryReader.ts b/packages/core/src/readers/SimpleDirectoryReader.ts
index 81ab8fe79dd7bd2ee27faf0e9ba5f84f90f0db43..6518c211a230b09e2fe4ef4f6eff5b91073cd2d6 100644
--- a/packages/core/src/readers/SimpleDirectoryReader.ts
+++ b/packages/core/src/readers/SimpleDirectoryReader.ts
@@ -1,13 +1,14 @@
-import { Document } from "../Node";
-import { defaultFS, path } from "../env";
-import { CompleteFileSystem, walk } from "../storage/FileSystem";
-import { PapaCSVReader } from "./CSVReader";
-import { DocxReader } from "./DocxReader";
-import { HTMLReader } from "./HTMLReader";
-import { ImageReader } from "./ImageReader";
-import { MarkdownReader } from "./MarkdownReader";
-import { PDFReader } from "./PDFReader";
-import { BaseReader } from "./type";
+import { defaultFS, path } from "@llamaindex/env";
+import { CompleteFileSystem } from "@llamaindex/env/type";
+import { Document } from "../Node.js";
+import { walk } from "../storage/FileSystem.js";
+import { PapaCSVReader } from "./CSVReader.js";
+import { DocxReader } from "./DocxReader.js";
+import { HTMLReader } from "./HTMLReader.js";
+import { ImageReader } from "./ImageReader.js";
+import { MarkdownReader } from "./MarkdownReader.js";
+import { PDFReader } from "./PDFReader.js";
+import { BaseReader } from "./type.js";
 
 type ReaderCallback = (
   category: "file" | "directory",
diff --git a/packages/core/src/readers/SimpleMongoReader.ts b/packages/core/src/readers/SimpleMongoReader.ts
index 885a62764a4f72830a73f7ae9324dd369487a293..f015868ac49406e67fa9e5301836c437dfd9a0e0 100644
--- a/packages/core/src/readers/SimpleMongoReader.ts
+++ b/packages/core/src/readers/SimpleMongoReader.ts
@@ -1,6 +1,6 @@
 import { MongoClient } from "mongodb";
-import { Document, Metadata } from "../Node";
-import { BaseReader } from "./type";
+import { Document, Metadata } from "../Node.js";
+import { BaseReader } from "./type.js";
 
 /**
  * Read in from MongoDB
diff --git a/packages/core/src/readers/index.ts b/packages/core/src/readers/index.ts
index fc3411a17622b83660050591749898a29c416057..db782d897b947f764443cd3b0446d09aac205d9f 100644
--- a/packages/core/src/readers/index.ts
+++ b/packages/core/src/readers/index.ts
@@ -1,12 +1,12 @@
-export * from "./AssemblyAIReader";
-export * from "./CSVReader";
-export * from "./DocxReader";
-export * from "./HTMLReader";
-export * from "./ImageReader";
-export * from "./LlamaParseReader";
-export * from "./MarkdownReader";
-export * from "./NotionReader";
-export * from "./PDFReader";
-export * from "./SimpleDirectoryReader";
-export * from "./SimpleMongoReader";
-export * from "./type";
+export * from "./AssemblyAIReader.js";
+export * from "./CSVReader.js";
+export * from "./DocxReader.js";
+export * from "./HTMLReader.js";
+export * from "./ImageReader.js";
+export * from "./LlamaParseReader.js";
+export * from "./MarkdownReader.js";
+export * from "./NotionReader.js";
+export * from "./PDFReader.js";
+export * from "./SimpleDirectoryReader.js";
+export * from "./SimpleMongoReader.js";
+export * from "./type.js";
diff --git a/packages/core/src/readers/type.ts b/packages/core/src/readers/type.ts
index 8615240eee8ff8dd7bb91655f62dab9abb8fe306..14ac3b2f4489d315b7cb1bc40e99077109bcfe01 100644
--- a/packages/core/src/readers/type.ts
+++ b/packages/core/src/readers/type.ts
@@ -1,5 +1,5 @@
-import { Document } from "../Node";
-import { CompleteFileSystem } from "../storage";
+import { CompleteFileSystem } from "@llamaindex/env/type";
+import { Document } from "../Node.js";
 
 /**
  * A reader takes imports data into Document objects.
diff --git a/packages/core/src/selectors/base.ts b/packages/core/src/selectors/base.ts
index 3268d55e1f0e61f6271732712a9cab3cedc7e065..f6992533e86a3b702ef39d3a3bad74dd310947e0 100644
--- a/packages/core/src/selectors/base.ts
+++ b/packages/core/src/selectors/base.ts
@@ -1,5 +1,5 @@
-import { PromptMixin } from "../prompts";
-import { QueryBundle, ToolMetadataOnlyDescription } from "../types";
+import { PromptMixin } from "../prompts/Mixin.js";
+import { QueryBundle, ToolMetadataOnlyDescription } from "../types.js";
 
 export interface SingleSelection {
   index: number;
diff --git a/packages/core/src/selectors/index.ts b/packages/core/src/selectors/index.ts
index c3dd0aaf7badf6809b04ef7c7cb51e303e1514af..432c81dcfcb268d49dcc5c024e33ffdeb75e34bb 100644
--- a/packages/core/src/selectors/index.ts
+++ b/packages/core/src/selectors/index.ts
@@ -1,3 +1,3 @@
-export * from "./base";
-export * from "./llmSelectors";
-export * from "./utils";
+export * from "./base.js";
+export * from "./llmSelectors.js";
+export * from "./utils.js";
diff --git a/packages/core/src/selectors/llmSelectors.ts b/packages/core/src/selectors/llmSelectors.ts
index c1a51c6e168bc6ade31bfb22ef0b33ae840f329d..bdc689941e5ce9c5581b36ecf689123ca8ae7fb7 100644
--- a/packages/core/src/selectors/llmSelectors.ts
+++ b/packages/core/src/selectors/llmSelectors.ts
@@ -1,18 +1,18 @@
-import { LLM } from "../llm";
-import { Answer, SelectionOutputParser } from "../outputParsers/selectors";
+import { LLM } from "../llm/index.js";
+import { Answer, SelectionOutputParser } from "../outputParsers/selectors.js";
 import {
   BaseOutputParser,
   QueryBundle,
   StructuredOutput,
   ToolMetadataOnlyDescription,
-} from "../types";
-import { BaseSelector, SelectorResult } from "./base";
+} from "../types.js";
+import { BaseSelector, SelectorResult } from "./base.js";
 import {
   MultiSelectPrompt,
   SingleSelectPrompt,
   defaultMultiSelectPrompt,
   defaultSingleSelectPrompt,
-} from "./prompts";
+} from "./prompts.js";
 
 function buildChoicesText(choices: ToolMetadataOnlyDescription[]): string {
   const texts: string[] = [];
diff --git a/packages/core/src/selectors/utils.ts b/packages/core/src/selectors/utils.ts
index 08b2226e165f07e4b1b62b727aa5259754454e61..2b6f8bde9f163f37c63979b86c3c277ff814556f 100644
--- a/packages/core/src/selectors/utils.ts
+++ b/packages/core/src/selectors/utils.ts
@@ -1,6 +1,6 @@
-import { ServiceContext } from "../ServiceContext";
-import { BaseSelector } from "./base";
-import { LLMMultiSelector, LLMSingleSelector } from "./llmSelectors";
+import { ServiceContext } from "../ServiceContext.js";
+import { BaseSelector } from "./base.js";
+import { LLMMultiSelector, LLMSingleSelector } from "./llmSelectors.js";
 
 export const getSelectorFromContext = (
   serviceContext: ServiceContext,
diff --git a/packages/core/src/storage/FileSystem.ts b/packages/core/src/storage/FileSystem.ts
index cf58573da94c7d2c456298deadaa9e32536dc2ef..cdafd3147b13b52e643ab1f7a9ccce09a5d505cc 100644
--- a/packages/core/src/storage/FileSystem.ts
+++ b/packages/core/src/storage/FileSystem.ts
@@ -1,83 +1,4 @@
-import _ from "lodash";
-
-/**
- * A filesystem interface that is meant to be compatible with
- * the 'fs' module from Node.js.
- * Allows for the use of similar inteface implementation on
- * browsers.
- */
-export type GenericFileSystem = {
-  writeFile(path: string, content: string): Promise<void>;
-  /**
-   * Reads a file and returns its content as a raw buffer.
-   */
-  readRawFile(path: string): Promise<Buffer>;
-  /**
-   * Reads a file and returns its content as an utf-8 string.
-   */
-  readFile(path: string): Promise<string>;
-  access(path: string): Promise<void>;
-  mkdir(
-    path: string,
-    options: {
-      recursive: boolean;
-    },
-  ): Promise<string | undefined>;
-  mkdir(path: string): Promise<void>;
-};
-
-export type WalkableFileSystem = {
-  readdir(path: string): Promise<string[]>;
-  stat(path: string): Promise<any>;
-};
-
-export type CompleteFileSystem = GenericFileSystem & WalkableFileSystem;
-
-/**
- * A filesystem implementation that stores files in memory.
- */
-export class InMemoryFileSystem implements CompleteFileSystem {
-  private files: Record<string, any> = {};
-
-  async writeFile(
-    path: string,
-    content: string,
-    options?: unknown,
-  ): Promise<void> {
-    this.files[path] = _.cloneDeep(content);
-  }
-
-  async readFile(path: string): Promise<string> {
-    if (!(path in this.files)) {
-      throw new Error(`File ${path} does not exist`);
-    }
-    return _.cloneDeep(this.files[path]);
-  }
-
-  async access(path: string): Promise<void> {
-    if (!(path in this.files)) {
-      throw new Error(`File ${path} does not exist`);
-    }
-  }
-
-  async mkdir(path: string) {
-    this.files[path] = _.get(this.files, path, null);
-    return undefined;
-  }
-
-  async readdir(path: string): Promise<string[]> {
-    throw new Error("Not implemented");
-  }
-
-  async stat(path: string): Promise<any> {
-    throw new Error("Not implemented");
-  }
-
-  async readRawFile(path: string): Promise<Buffer> {
-    throw new Error("Not implemented");
-  }
-}
-
+import { GenericFileSystem, WalkableFileSystem } from "@llamaindex/env/type";
 // FS utility functions
 
 /**
diff --git a/packages/core/src/storage/StorageContext.ts b/packages/core/src/storage/StorageContext.ts
index 50e973a08f9e942babd91f097b048aaa9cd1681f..f178d3e3bc603005fbdd0b4f1fde70beb51f0a55 100644
--- a/packages/core/src/storage/StorageContext.ts
+++ b/packages/core/src/storage/StorageContext.ts
@@ -1,12 +1,15 @@
-import { defaultFS, path } from "../env";
-import { GenericFileSystem } from "./FileSystem";
-import { DEFAULT_IMAGE_VECTOR_NAMESPACE, DEFAULT_NAMESPACE } from "./constants";
-import { SimpleDocumentStore } from "./docStore/SimpleDocumentStore";
-import { BaseDocumentStore } from "./docStore/types";
-import { SimpleIndexStore } from "./indexStore/SimpleIndexStore";
-import { BaseIndexStore } from "./indexStore/types";
-import { SimpleVectorStore } from "./vectorStore/SimpleVectorStore";
-import { VectorStore } from "./vectorStore/types";
+import { defaultFS, path } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
+import {
+  DEFAULT_IMAGE_VECTOR_NAMESPACE,
+  DEFAULT_NAMESPACE,
+} from "./constants.js";
+import { SimpleDocumentStore } from "./docStore/SimpleDocumentStore.js";
+import { BaseDocumentStore } from "./docStore/types.js";
+import { SimpleIndexStore } from "./indexStore/SimpleIndexStore.js";
+import { BaseIndexStore } from "./indexStore/types.js";
+import { SimpleVectorStore } from "./vectorStore/SimpleVectorStore.js";
+import { VectorStore } from "./vectorStore/types.js";
 
 export interface StorageContext {
   docStore: BaseDocumentStore;
diff --git a/packages/core/src/storage/chatStore/SimpleChatStore.ts b/packages/core/src/storage/chatStore/SimpleChatStore.ts
index b2b272bd7049eb34052dfad4251feb358f23e86c..22e06b4c6bcb2a72bfe980a2dd8768ce8c7e4021 100644
--- a/packages/core/src/storage/chatStore/SimpleChatStore.ts
+++ b/packages/core/src/storage/chatStore/SimpleChatStore.ts
@@ -1,5 +1,5 @@
-import { ChatMessage } from "../../llm";
-import { BaseChatStore } from "./types";
+import { ChatMessage } from "../../llm/index.js";
+import { BaseChatStore } from "./types.js";
 
 /**
  * Simple chat store.
diff --git a/packages/core/src/storage/chatStore/types.ts b/packages/core/src/storage/chatStore/types.ts
index a72a296d5055589dca44954bcdf932acc3c79489..87c7f892c5bebc0e85b1fcdc26572ce3efda07a7 100644
--- a/packages/core/src/storage/chatStore/types.ts
+++ b/packages/core/src/storage/chatStore/types.ts
@@ -1,4 +1,4 @@
-import { ChatMessage } from "../../llm";
+import { ChatMessage } from "../../llm/index.js";
 
 export interface BaseChatStore {
   setMessages(key: string, messages: ChatMessage[]): void;
diff --git a/packages/core/src/storage/docStore/KVDocumentStore.ts b/packages/core/src/storage/docStore/KVDocumentStore.ts
index b14ab68bf708eb15df8aadf2fb8f16162a4f4788..e2d56bd4acb3d63aad7b82448016e446451ce638 100644
--- a/packages/core/src/storage/docStore/KVDocumentStore.ts
+++ b/packages/core/src/storage/docStore/KVDocumentStore.ts
@@ -1,9 +1,9 @@
 import _, * as lodash from "lodash";
-import { BaseNode, ObjectType } from "../../Node";
-import { DEFAULT_NAMESPACE } from "../constants";
-import { BaseKVStore } from "../kvStore/types";
-import { BaseDocumentStore, RefDocInfo } from "./types";
-import { docToJson, jsonToDoc } from "./utils";
+import { BaseNode, ObjectType } from "../../Node.js";
+import { DEFAULT_NAMESPACE } from "../constants.js";
+import { BaseKVStore } from "../kvStore/types.js";
+import { BaseDocumentStore, RefDocInfo } from "./types.js";
+import { docToJson, jsonToDoc } from "./utils.js";
 
 type DocMetaData = { docHash: string; refDocId?: string };
 
diff --git a/packages/core/src/storage/docStore/SimpleDocumentStore.ts b/packages/core/src/storage/docStore/SimpleDocumentStore.ts
index c05d93424f77e3c44b418e8baefee5fa5d2e6b19..ccce62a80a73e0eb5ed54f7e3e398f3498f40f2f 100644
--- a/packages/core/src/storage/docStore/SimpleDocumentStore.ts
+++ b/packages/core/src/storage/docStore/SimpleDocumentStore.ts
@@ -1,14 +1,14 @@
+import { defaultFS, path } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
 import _ from "lodash";
-import { defaultFS, path } from "../../env";
-import { GenericFileSystem } from "../FileSystem";
 import {
   DEFAULT_DOC_STORE_PERSIST_FILENAME,
   DEFAULT_NAMESPACE,
   DEFAULT_PERSIST_DIR,
-} from "../constants";
-import { SimpleKVStore } from "../kvStore/SimpleKVStore";
-import { BaseInMemoryKVStore } from "../kvStore/types";
-import { KVDocumentStore } from "./KVDocumentStore";
+} from "../constants.js";
+import { SimpleKVStore } from "../kvStore/SimpleKVStore.js";
+import { BaseInMemoryKVStore } from "../kvStore/types.js";
+import { KVDocumentStore } from "./KVDocumentStore.js";
 
 type SaveDict = Record<string, any>;
 
diff --git a/packages/core/src/storage/docStore/types.ts b/packages/core/src/storage/docStore/types.ts
index 3ac144ae8c92170bff44b85ad81051250ad783f7..228999bd04a4cc985ddcdd49e354e18d7d4ac2cd 100644
--- a/packages/core/src/storage/docStore/types.ts
+++ b/packages/core/src/storage/docStore/types.ts
@@ -1,9 +1,9 @@
-import { BaseNode } from "../../Node";
+import { GenericFileSystem } from "@llamaindex/env/type";
+import { BaseNode } from "../../Node.js";
 import {
   DEFAULT_DOC_STORE_PERSIST_FILENAME,
   DEFAULT_PERSIST_DIR,
-} from "../constants";
-import { GenericFileSystem } from "../FileSystem";
+} from "../constants.js";
 
 const defaultPersistPath = `${DEFAULT_PERSIST_DIR}/${DEFAULT_DOC_STORE_PERSIST_FILENAME}`;
 
diff --git a/packages/core/src/storage/docStore/utils.ts b/packages/core/src/storage/docStore/utils.ts
index e4c77f76a02051f8fbf00275ba5b446069788e02..f84c1a8bed761b3178f4eae4557d8bb73baf72cf 100644
--- a/packages/core/src/storage/docStore/utils.ts
+++ b/packages/core/src/storage/docStore/utils.ts
@@ -1,4 +1,4 @@
-import { BaseNode, Document, ObjectType, TextNode } from "../../Node";
+import { BaseNode, Document, ObjectType, TextNode } from "../../Node.js";
 
 const TYPE_KEY = "__type__";
 const DATA_KEY = "__data__";
diff --git a/packages/core/src/storage/index.ts b/packages/core/src/storage/index.ts
index 2dbc4fd1e80bd0ca9abd081bbf247c77f63de0f8..428d3ed3c4294beb5b38e53a465d00489f0e1142 100644
--- a/packages/core/src/storage/index.ts
+++ b/packages/core/src/storage/index.ts
@@ -1,19 +1,19 @@
-export * from "./FileSystem";
-export * from "./StorageContext";
-export { SimpleChatStore } from "./chatStore/SimpleChatStore";
-export * from "./chatStore/types";
-export * from "./constants";
-export { SimpleDocumentStore } from "./docStore/SimpleDocumentStore";
-export * from "./docStore/types";
-export { SimpleIndexStore } from "./indexStore/SimpleIndexStore";
-export * from "./indexStore/types";
-export { SimpleKVStore } from "./kvStore/SimpleKVStore";
-export * from "./kvStore/types";
-export { AstraDBVectorStore } from "./vectorStore/AstraDBVectorStore";
-export { ChromaVectorStore } from "./vectorStore/ChromaVectorStore";
-export { MongoDBAtlasVectorSearch } from "./vectorStore/MongoDBAtlasVectorStore";
-export { PGVectorStore } from "./vectorStore/PGVectorStore";
-export { PineconeVectorStore } from "./vectorStore/PineconeVectorStore";
-export { QdrantVectorStore } from "./vectorStore/QdrantVectorStore";
-export { SimpleVectorStore } from "./vectorStore/SimpleVectorStore";
-export * from "./vectorStore/types";
+export * from "./FileSystem.js";
+export * from "./StorageContext.js";
+export { SimpleChatStore } from "./chatStore/SimpleChatStore.js";
+export * from "./chatStore/types.js";
+export * from "./constants.js";
+export { SimpleDocumentStore } from "./docStore/SimpleDocumentStore.js";
+export * from "./docStore/types.js";
+export { SimpleIndexStore } from "./indexStore/SimpleIndexStore.js";
+export * from "./indexStore/types.js";
+export { SimpleKVStore } from "./kvStore/SimpleKVStore.js";
+export * from "./kvStore/types.js";
+export { AstraDBVectorStore } from "./vectorStore/AstraDBVectorStore.js";
+export { ChromaVectorStore } from "./vectorStore/ChromaVectorStore.js";
+export { MongoDBAtlasVectorSearch } from "./vectorStore/MongoDBAtlasVectorStore.js";
+export { PGVectorStore } from "./vectorStore/PGVectorStore.js";
+export { PineconeVectorStore } from "./vectorStore/PineconeVectorStore.js";
+export { QdrantVectorStore } from "./vectorStore/QdrantVectorStore.js";
+export { SimpleVectorStore } from "./vectorStore/SimpleVectorStore.js";
+export * from "./vectorStore/types.js";
diff --git a/packages/core/src/storage/indexStore/KVIndexStore.ts b/packages/core/src/storage/indexStore/KVIndexStore.ts
index b3744fabf8135c4929760d1d3ebc0ecdd004d4de..3d15ce9d15e02be71725a870cad987bb21fe9941 100644
--- a/packages/core/src/storage/indexStore/KVIndexStore.ts
+++ b/packages/core/src/storage/indexStore/KVIndexStore.ts
@@ -1,8 +1,9 @@
 import _ from "lodash";
-import { IndexStruct, jsonToIndexStruct } from "../../indices/BaseIndex";
-import { DEFAULT_NAMESPACE } from "../constants";
-import { BaseKVStore } from "../kvStore/types";
-import { BaseIndexStore } from "./types";
+import { IndexStruct } from "../../indices/IndexStruct.js";
+import { jsonToIndexStruct } from "../../indices/json-to-index-struct.js";
+import { DEFAULT_NAMESPACE } from "../constants.js";
+import { BaseKVStore } from "../kvStore/types.js";
+import { BaseIndexStore } from "./types.js";
 
 export class KVIndexStore extends BaseIndexStore {
   private _kvStore: BaseKVStore;
diff --git a/packages/core/src/storage/indexStore/SimpleIndexStore.ts b/packages/core/src/storage/indexStore/SimpleIndexStore.ts
index 49ab6f3cc377829078f5d33172aa0fb41efd2676..e312634048520d93612a14f6dc39964d7bf9299f 100644
--- a/packages/core/src/storage/indexStore/SimpleIndexStore.ts
+++ b/packages/core/src/storage/indexStore/SimpleIndexStore.ts
@@ -1,12 +1,12 @@
-import { defaultFS, path } from "../../env";
-import { GenericFileSystem } from "../FileSystem";
+import { defaultFS, path } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
 import {
   DEFAULT_INDEX_STORE_PERSIST_FILENAME,
   DEFAULT_PERSIST_DIR,
-} from "../constants";
-import { DataType, SimpleKVStore } from "../kvStore/SimpleKVStore";
-import { BaseInMemoryKVStore } from "../kvStore/types";
-import { KVIndexStore } from "./KVIndexStore";
+} from "../constants.js";
+import { DataType, SimpleKVStore } from "../kvStore/SimpleKVStore.js";
+import { BaseInMemoryKVStore } from "../kvStore/types.js";
+import { KVIndexStore } from "./KVIndexStore.js";
 
 export class SimpleIndexStore extends KVIndexStore {
   private kvStore: BaseInMemoryKVStore;
diff --git a/packages/core/src/storage/indexStore/types.ts b/packages/core/src/storage/indexStore/types.ts
index 00babcdd10c3d9435e0153395c94641db7fc882c..378166f8e925ccada562fe8a0434e133743e7885 100644
--- a/packages/core/src/storage/indexStore/types.ts
+++ b/packages/core/src/storage/indexStore/types.ts
@@ -1,9 +1,9 @@
-import { IndexStruct } from "../../indices/BaseIndex";
-import { GenericFileSystem } from "../FileSystem";
+import { GenericFileSystem } from "@llamaindex/env/type";
+import { IndexStruct } from "../../indices/IndexStruct.js";
 import {
   DEFAULT_INDEX_STORE_PERSIST_FILENAME,
   DEFAULT_PERSIST_DIR,
-} from "../constants";
+} from "../constants.js";
 
 const defaultPersistPath = `${DEFAULT_PERSIST_DIR}/${DEFAULT_INDEX_STORE_PERSIST_FILENAME}`;
 
diff --git a/packages/core/src/storage/kvStore/SimpleKVStore.ts b/packages/core/src/storage/kvStore/SimpleKVStore.ts
index cefa6498ffa915db51075b64c1673834cd25b45a..fe7c2211c6fd8a58dad4d9c758e280bf25898ef7 100644
--- a/packages/core/src/storage/kvStore/SimpleKVStore.ts
+++ b/packages/core/src/storage/kvStore/SimpleKVStore.ts
@@ -1,8 +1,9 @@
+import { defaultFS, path } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
 import _ from "lodash";
-import { defaultFS, path } from "../../env";
-import { GenericFileSystem, exists } from "../FileSystem";
-import { DEFAULT_COLLECTION } from "../constants";
-import { BaseKVStore } from "./types";
+import { exists } from "../FileSystem.js";
+import { DEFAULT_COLLECTION } from "../constants.js";
+import { BaseKVStore } from "./types.js";
 
 export type DataType = Record<string, Record<string, any>>;
 
@@ -58,8 +59,10 @@ export class SimpleKVStore extends BaseKVStore {
     return false;
   }
 
-  async persist(persistPath: string, fs?: GenericFileSystem): Promise<void> {
-    fs = fs || defaultFS;
+  async persist(
+    persistPath: string,
+    fs: GenericFileSystem = defaultFS,
+  ): Promise<void> {
     // TODO: decide on a way to polyfill path
     const dirPath = path.dirname(persistPath);
     if (!(await exists(fs, dirPath))) {
@@ -70,9 +73,8 @@ export class SimpleKVStore extends BaseKVStore {
 
   static async fromPersistPath(
     persistPath: string,
-    fs?: GenericFileSystem,
+    fs: GenericFileSystem = defaultFS,
   ): Promise<SimpleKVStore> {
-    fs = fs || defaultFS;
     const dirPath = path.dirname(persistPath);
     if (!(await exists(fs, dirPath))) {
       await fs.mkdir(dirPath);
diff --git a/packages/core/src/storage/kvStore/types.ts b/packages/core/src/storage/kvStore/types.ts
index 3ff05a2538c9996cd6612c7ff88344b8ef8c1d1a..6005c023a089402261bb30689db738b2df018a64 100644
--- a/packages/core/src/storage/kvStore/types.ts
+++ b/packages/core/src/storage/kvStore/types.ts
@@ -1,4 +1,4 @@
-import { GenericFileSystem } from "../FileSystem";
+import { GenericFileSystem } from "@llamaindex/env/type";
 const defaultCollection = "data";
 
 type StoredValue = Record<string, any> | null;
diff --git a/packages/core/src/storage/vectorStore/AstraDBVectorStore.ts b/packages/core/src/storage/vectorStore/AstraDBVectorStore.ts
index fd258c3b8c3ef2cdf36873903866b4fa6d9904c9..72ab14fd7df218603f4e95f7f7811fbcbeebcd49 100644
--- a/packages/core/src/storage/vectorStore/AstraDBVectorStore.ts
+++ b/packages/core/src/storage/vectorStore/AstraDBVectorStore.ts
@@ -1,9 +1,12 @@
 import { AstraDB } from "@datastax/astra-db-ts";
 import { Collection } from "@datastax/astra-db-ts/dist/collections";
-import { CreateCollectionOptions } from "@datastax/astra-db-ts/dist/collections/options";
-import { BaseNode, MetadataMode } from "../../Node";
-import { VectorStore, VectorStoreQuery, VectorStoreQueryResult } from "./types";
-import { metadataDictToNode, nodeToMetadata } from "./utils";
+import { BaseNode, MetadataMode } from "../../Node.js";
+import {
+  VectorStore,
+  VectorStoreQuery,
+  VectorStoreQueryResult,
+} from "./types.js";
+import { metadataDictToNode, nodeToMetadata } from "./utils.js";
 
 const MAX_INSERT_BATCH_SIZE = 20;
 
@@ -64,7 +67,7 @@ export class AstraDBVectorStore implements VectorStore {
    */
   async create(
     collection: string,
-    options: CreateCollectionOptions,
+    options?: Parameters<AstraDB["createCollection"]>[1],
   ): Promise<void> {
     await this.astraDBClient.createCollection(collection, options);
     console.debug("Created Astra DB collection");
diff --git a/packages/core/src/storage/vectorStore/ChromaVectorStore.ts b/packages/core/src/storage/vectorStore/ChromaVectorStore.ts
index cc3321babf698bacd5418b9fb9f153464d1ea6fe..f5ace2dab16dff9c91ed6c4a9b002ae0b94888a2 100644
--- a/packages/core/src/storage/vectorStore/ChromaVectorStore.ts
+++ b/packages/core/src/storage/vectorStore/ChromaVectorStore.ts
@@ -8,14 +8,14 @@ import {
   Where,
   WhereDocument,
 } from "chromadb";
-import { BaseNode, MetadataMode } from "../../Node";
+import { BaseNode, MetadataMode } from "../../Node.js";
 import {
   VectorStore,
   VectorStoreQuery,
   VectorStoreQueryMode,
   VectorStoreQueryResult,
-} from "./types";
-import { metadataDictToNode, nodeToMetadata } from "./utils";
+} from "./types.js";
+import { metadataDictToNode, nodeToMetadata } from "./utils.js";
 
 type ChromaDeleteOptions = {
   where?: Where;
diff --git a/packages/core/src/storage/vectorStore/MongoDBAtlasVectorStore.ts b/packages/core/src/storage/vectorStore/MongoDBAtlasVectorStore.ts
index 434e0afe6502c1049ddcb80d8a01c032f8a25222..919b32052f6760383708dd3f1e76e3f5f95cd5c2 100644
--- a/packages/core/src/storage/vectorStore/MongoDBAtlasVectorStore.ts
+++ b/packages/core/src/storage/vectorStore/MongoDBAtlasVectorStore.ts
@@ -1,12 +1,12 @@
 import { BulkWriteOptions, Collection, MongoClient } from "mongodb";
-import { BaseNode, MetadataMode } from "../../Node";
+import { BaseNode, MetadataMode } from "../../Node.js";
 import {
   MetadataFilters,
   VectorStore,
   VectorStoreQuery,
   VectorStoreQueryResult,
-} from "./types";
-import { metadataDictToNode, nodeToMetadata } from "./utils";
+} from "./types.js";
+import { metadataDictToNode, nodeToMetadata } from "./utils.js";
 
 // Utility function to convert metadata filters to MongoDB filter
 function toMongoDBFilter(
diff --git a/packages/core/src/storage/vectorStore/PGVectorStore.ts b/packages/core/src/storage/vectorStore/PGVectorStore.ts
index ad3b7ca9acf84b3b4947048fecbb150065ec2816..7b20916d9b6949a97d30d2dcaaba813aab018a49 100644
--- a/packages/core/src/storage/vectorStore/PGVectorStore.ts
+++ b/packages/core/src/storage/vectorStore/PGVectorStore.ts
@@ -1,10 +1,14 @@
 import pg from "pg";
 import pgvector from "pgvector/pg";
 
-import { VectorStore, VectorStoreQuery, VectorStoreQueryResult } from "./types";
-
-import { BaseNode, Document, Metadata, MetadataMode } from "../../Node";
-import { GenericFileSystem } from "../FileSystem";
+import {
+  VectorStore,
+  VectorStoreQuery,
+  VectorStoreQueryResult,
+} from "./types.js";
+
+import { GenericFileSystem } from "@llamaindex/env/type";
+import { BaseNode, Document, Metadata, MetadataMode } from "../../Node.js";
 
 export const PGVECTOR_SCHEMA = "public";
 export const PGVECTOR_TABLE = "llamaindex_embedding";
diff --git a/packages/core/src/storage/vectorStore/PineconeVectorStore.ts b/packages/core/src/storage/vectorStore/PineconeVectorStore.ts
index 42e7ffe9c9ee116c63a16e361d2dc4f1e96896d5..8d3dec3ba17cf01280dfa5f65183476c76d8509f 100644
--- a/packages/core/src/storage/vectorStore/PineconeVectorStore.ts
+++ b/packages/core/src/storage/vectorStore/PineconeVectorStore.ts
@@ -4,18 +4,17 @@ import {
   VectorStore,
   VectorStoreQuery,
   VectorStoreQueryResult,
-} from "./types";
-
-import { BaseNode, Metadata } from "../../Node";
-import { GenericFileSystem } from "../FileSystem";
+} from "./types.js";
 
+import { GenericFileSystem } from "@llamaindex/env/type";
 import {
   FetchResponse,
   Index,
   Pinecone,
   ScoredPineconeRecord,
 } from "@pinecone-database/pinecone";
-import { metadataDictToNode, nodeToMetadata } from "./utils";
+import { BaseNode, Metadata } from "../../Node.js";
+import { metadataDictToNode, nodeToMetadata } from "./utils.js";
 
 type PineconeParams = {
   indexName?: string;
diff --git a/packages/core/src/storage/vectorStore/QdrantVectorStore.ts b/packages/core/src/storage/vectorStore/QdrantVectorStore.ts
index 1e8afe1d6bdcafe284309db4a783bb9a2a9097df..0d656d15fb6bac68e63346c5686f9b5e19166b26 100644
--- a/packages/core/src/storage/vectorStore/QdrantVectorStore.ts
+++ b/packages/core/src/storage/vectorStore/QdrantVectorStore.ts
@@ -1,8 +1,12 @@
-import { BaseNode } from "../../Node";
-import { VectorStore, VectorStoreQuery, VectorStoreQueryResult } from "./types";
+import { BaseNode } from "../../Node.js";
+import {
+  VectorStore,
+  VectorStoreQuery,
+  VectorStoreQueryResult,
+} from "./types.js";
 
 import { QdrantClient } from "@qdrant/js-client-rest";
-import { metadataDictToNode, nodeToMetadata } from "./utils";
+import { metadataDictToNode, nodeToMetadata } from "./utils.js";
 
 type PointStruct = {
   id: string;
diff --git a/packages/core/src/storage/vectorStore/SimpleVectorStore.ts b/packages/core/src/storage/vectorStore/SimpleVectorStore.ts
index 8b995e2c9cab7791bf6b4fb493644c40ffc8ee3e..85b286c32e34f664d1a650a3d427673765ca8c96 100644
--- a/packages/core/src/storage/vectorStore/SimpleVectorStore.ts
+++ b/packages/core/src/storage/vectorStore/SimpleVectorStore.ts
@@ -1,19 +1,20 @@
+import { defaultFS, path } from "@llamaindex/env";
+import { GenericFileSystem } from "@llamaindex/env/type";
 import _ from "lodash";
-import { BaseNode } from "../../Node";
+import { BaseNode } from "../../Node.js";
 import {
   getTopKEmbeddings,
   getTopKEmbeddingsLearner,
   getTopKMMREmbeddings,
-} from "../../embeddings/utils";
-import { defaultFS, path } from "../../env";
-import { GenericFileSystem, exists } from "../FileSystem";
-import { DEFAULT_PERSIST_DIR } from "../constants";
+} from "../../embeddings/utils.js";
+import { exists } from "../FileSystem.js";
+import { DEFAULT_PERSIST_DIR } from "../constants.js";
 import {
   VectorStore,
   VectorStoreQuery,
   VectorStoreQueryMode,
   VectorStoreQueryResult,
-} from "./types";
+} from "./types.js";
 
 const LEARNER_MODES = new Set<VectorStoreQueryMode>([
   VectorStoreQueryMode.SVM,
@@ -157,10 +158,8 @@ export class SimpleVectorStore implements VectorStore {
 
   static async fromPersistPath(
     persistPath: string,
-    fs?: GenericFileSystem,
+    fs: GenericFileSystem = defaultFS,
   ): Promise<SimpleVectorStore> {
-    fs = fs || defaultFS;
-
     const dirPath = path.dirname(persistPath);
     if (!(await exists(fs, dirPath))) {
       await fs.mkdir(dirPath, { recursive: true });
diff --git a/packages/core/src/storage/vectorStore/types.ts b/packages/core/src/storage/vectorStore/types.ts
index be4bb0968607f2626f0868bcd4ded9428a575ecc..d3451143bf09a1c6dcfa6d15a1464fcd61c08bdb 100644
--- a/packages/core/src/storage/vectorStore/types.ts
+++ b/packages/core/src/storage/vectorStore/types.ts
@@ -1,4 +1,4 @@
-import { BaseNode } from "../../Node";
+import { BaseNode } from "../../Node.js";
 
 export interface VectorStoreQueryResult {
   nodes?: BaseNode[];
diff --git a/packages/core/src/storage/vectorStore/utils.ts b/packages/core/src/storage/vectorStore/utils.ts
index 0944341ac7ca3ab72a0f269b0e7e956e6461354a..34af36316238c89e2020a0137b209075c21aad24 100644
--- a/packages/core/src/storage/vectorStore/utils.ts
+++ b/packages/core/src/storage/vectorStore/utils.ts
@@ -1,4 +1,4 @@
-import { BaseNode, jsonToNode, Metadata, ObjectType } from "../../Node";
+import { BaseNode, jsonToNode, Metadata, ObjectType } from "../../Node.js";
 
 const DEFAULT_TEXT_KEY = "text";
 
diff --git a/packages/core/src/synthesizers/MultiModalResponseSynthesizer.ts b/packages/core/src/synthesizers/MultiModalResponseSynthesizer.ts
index 849b8ad271f399c3f92e2b41121ad08b863dd835..59166895817ed3c9e338795d02a0407cbfae80af 100644
--- a/packages/core/src/synthesizers/MultiModalResponseSynthesizer.ts
+++ b/packages/core/src/synthesizers/MultiModalResponseSynthesizer.ts
@@ -1,15 +1,18 @@
-import { ImageNode, MetadataMode, splitNodesByType } from "../Node";
-import { Response } from "../Response";
-import { ServiceContext, serviceContextFromDefaults } from "../ServiceContext";
-import { imageToDataUrl } from "../embeddings";
-import { MessageContentDetail } from "../llm/types";
-import { PromptMixin } from "../prompts";
-import { TextQaPrompt, defaultTextQaPrompt } from "./../Prompt";
+import { ImageNode, MetadataMode, splitNodesByType } from "../Node.js";
+import { Response } from "../Response.js";
+import {
+  ServiceContext,
+  serviceContextFromDefaults,
+} from "../ServiceContext.js";
+import { imageToDataUrl } from "../embeddings/index.js";
+import { MessageContentDetail } from "../llm/types.js";
+import { PromptMixin } from "../prompts/Mixin.js";
+import { TextQaPrompt, defaultTextQaPrompt } from "./../Prompt.js";
 import {
   BaseSynthesizer,
   SynthesizeParamsNonStreaming,
   SynthesizeParamsStreaming,
-} from "./types";
+} from "./types.js";
 
 export class MultiModalResponseSynthesizer
   extends PromptMixin
diff --git a/packages/core/src/synthesizers/ResponseSynthesizer.ts b/packages/core/src/synthesizers/ResponseSynthesizer.ts
index 7b28677b484a818f2455766af22331cee9188d2e..f2a8daf9c7c1dd2cff8498d53413f98f50932eb1 100644
--- a/packages/core/src/synthesizers/ResponseSynthesizer.ts
+++ b/packages/core/src/synthesizers/ResponseSynthesizer.ts
@@ -1,15 +1,18 @@
-import { MetadataMode } from "../Node";
-import { Response } from "../Response";
-import { ServiceContext, serviceContextFromDefaults } from "../ServiceContext";
-import { streamConverter } from "../llm/utils";
-import { PromptMixin } from "../prompts";
-import { ResponseBuilderPrompts, getResponseBuilder } from "./builders";
+import { MetadataMode } from "../Node.js";
+import { Response } from "../Response.js";
+import {
+  ServiceContext,
+  serviceContextFromDefaults,
+} from "../ServiceContext.js";
+import { streamConverter } from "../llm/utils.js";
+import { PromptMixin } from "../prompts/Mixin.js";
+import { ResponseBuilderPrompts, getResponseBuilder } from "./builders.js";
 import {
   BaseSynthesizer,
   ResponseBuilder,
   SynthesizeParamsNonStreaming,
   SynthesizeParamsStreaming,
-} from "./types";
+} from "./types.js";
 
 /**
  * A ResponseSynthesizer is used to generate a response from a query and a list of nodes.
diff --git a/packages/core/src/synthesizers/builders.ts b/packages/core/src/synthesizers/builders.ts
index edec2cfdb0351fcb6cafa93c38df502d9684c5db..0c232b9624fc7636dfe1e6df4a9decbe43fe4bad 100644
--- a/packages/core/src/synthesizers/builders.ts
+++ b/packages/core/src/synthesizers/builders.ts
@@ -1,6 +1,6 @@
-import { Event } from "../callbacks/CallbackManager";
-import { LLM } from "../llm";
-import { streamConverter } from "../llm/utils";
+import { Event } from "../callbacks/CallbackManager.js";
+import { LLM } from "../llm/index.js";
+import { streamConverter } from "../llm/utils.js";
 import {
   defaultRefinePrompt,
   defaultTextQaPrompt,
@@ -9,15 +9,15 @@ import {
   SimplePrompt,
   TextQaPrompt,
   TreeSummarizePrompt,
-} from "../Prompt";
-import { getBiggestPrompt, PromptHelper } from "../PromptHelper";
-import { PromptMixin } from "../prompts";
-import { ServiceContext } from "../ServiceContext";
+} from "../Prompt.js";
+import { getBiggestPrompt, PromptHelper } from "../PromptHelper.js";
+import { PromptMixin } from "../prompts/Mixin.js";
+import { ServiceContext } from "../ServiceContext.js";
 import {
   ResponseBuilder,
   ResponseBuilderParamsNonStreaming,
   ResponseBuilderParamsStreaming,
-} from "./types";
+} from "./types.js";
 
 /**
  * Response modes of the response synthesizer
diff --git a/packages/core/src/synthesizers/index.ts b/packages/core/src/synthesizers/index.ts
index 2ec58d918d3c502cf005d090c32018023107b035..4b4ba5eabf5bd79fb2775aac262a30f445fcbee2 100644
--- a/packages/core/src/synthesizers/index.ts
+++ b/packages/core/src/synthesizers/index.ts
@@ -1,4 +1,4 @@
-export * from "./MultiModalResponseSynthesizer";
-export * from "./ResponseSynthesizer";
-export * from "./builders";
-export * from "./types";
+export * from "./MultiModalResponseSynthesizer.js";
+export * from "./ResponseSynthesizer.js";
+export * from "./builders.js";
+export * from "./types.js";
diff --git a/packages/core/src/synthesizers/types.ts b/packages/core/src/synthesizers/types.ts
index 30798283649ea98e7a8a214f844253ed0b21daa8..333a3bdc4c796c3f2869c8636eecfc9a35a8fc96 100644
--- a/packages/core/src/synthesizers/types.ts
+++ b/packages/core/src/synthesizers/types.ts
@@ -1,7 +1,7 @@
-import { Event } from "../callbacks/CallbackManager";
-import { NodeWithScore } from "../Node";
-import { PromptMixin } from "../prompts";
-import { Response } from "../Response";
+import { Event } from "../callbacks/CallbackManager.js";
+import { NodeWithScore } from "../Node.js";
+import { PromptMixin } from "../prompts/Mixin.js";
+import { Response } from "../Response.js";
 
 export interface SynthesizeParamsBase {
   query: string;
diff --git a/packages/core/src/tests/GenericFileSystem.test.ts b/packages/core/src/tests/GenericFileSystem.test.ts
deleted file mode 100644
index 1ebb9da228737c11e5a880caec877a26d3951b84..0000000000000000000000000000000000000000
--- a/packages/core/src/tests/GenericFileSystem.test.ts
+++ /dev/null
@@ -1,133 +0,0 @@
-import nodeFS from "node:fs/promises";
-import os from "os";
-import path from "path";
-import { defaultFS } from "../env";
-import {
-  GenericFileSystem,
-  InMemoryFileSystem,
-  exists,
-  walk,
-} from "../storage/FileSystem";
-
-type FileSystemUnderTest = {
-  name: string;
-  prepare: () => Promise<any>;
-  cleanup: () => Promise<any>;
-  implementation: GenericFileSystem;
-  tempDir: string;
-};
-
-const cases: FileSystemUnderTest[] = [
-  {
-    name: "InMemoryFileSystem",
-    prepare: async () => {},
-    cleanup: async function () {
-      this.implementation = new InMemoryFileSystem();
-    },
-    implementation: new InMemoryFileSystem(),
-    tempDir: "./",
-  },
-  {
-    name: "Default fs",
-    prepare: async function () {
-      this.tempDir = await nodeFS.mkdtemp(path.join(os.tmpdir(), "jest-"));
-    },
-    cleanup: async function () {
-      await nodeFS.rm(this.tempDir, { recursive: true });
-    },
-    implementation: defaultFS,
-    tempDir: "./",
-  },
-];
-
-describe.each<FileSystemUnderTest>(cases)("Test %s", (testParams) => {
-  let testFS: GenericFileSystem;
-  let tempDir: string;
-
-  beforeEach(async () => {
-    await testParams.prepare();
-    testFS = testParams.implementation;
-    tempDir = testParams.tempDir;
-  });
-
-  afterEach(async () => {
-    await testParams.cleanup();
-  });
-
-  test("initializes", () => {
-    expect(testFS).toBeTruthy();
-  });
-
-  describe("writeFile", () => {
-    it("writes file to memory", async () => {
-      await testFS.writeFile(`${tempDir}/test.txt`, "Hello, world!");
-      expect(await testFS.readFile(`${tempDir}/test.txt`)).toBe(
-        "Hello, world!",
-      );
-    });
-
-    it("overwrites existing file", async () => {
-      await testFS.writeFile(`${tempDir}/test.txt`, "Hello, world!");
-      await testFS.writeFile(`${tempDir}/test.txt`, "Hello, again!");
-      expect(await testFS.readFile(`${tempDir}/test.txt`)).toBe(
-        "Hello, again!",
-      );
-    });
-  });
-
-  describe("readFile", () => {
-    it("throws error for non-existing file", async () => {
-      await expect(
-        testFS.readFile(`${tempDir}/not_exist.txt`),
-      ).rejects.toThrow();
-    });
-  });
-
-  describe("exists", () => {
-    it("returns true for existing file", async () => {
-      await testFS.writeFile(`${tempDir}/test.txt`, "Hello, world!");
-      expect(await exists(testFS, `${tempDir}/test.txt`)).toBe(true);
-    });
-
-    it("returns false for non-existing file", async () => {
-      expect(await exists(testFS, `${tempDir}/not_exist.txt`)).toBe(false);
-    });
-  });
-
-  describe("mkdir", () => {
-    it("creates directory if it doesn't exist", async () => {
-      await testFS.mkdir(`${tempDir}/testDir`);
-      expect(await exists(testFS, `${tempDir}/testDir`)).toBe(true);
-    });
-  });
-});
-
-describe("Test walk for Node.js fs", () => {
-  let tempDir: string;
-
-  beforeAll(async () => {
-    tempDir = await nodeFS.mkdtemp(path.join(os.tmpdir(), "jest-"));
-    await nodeFS.writeFile(`${tempDir}/test.txt`, "Hello, world!");
-    await nodeFS.mkdir(`${tempDir}/subDir`);
-    await nodeFS.writeFile(`${tempDir}/subDir/test2.txt`, "Hello, again!");
-  });
-
-  it("walks directory", async () => {
-    const expectedFiles = new Set([
-      `${tempDir}/subDir/test2.txt`,
-      `${tempDir}/test.txt`,
-    ]);
-
-    const actualFiles = new Set<string>();
-    for await (const file of walk(nodeFS, tempDir)) {
-      expect(file).toBeTruthy();
-      actualFiles.add(file);
-    }
-
-    expect(expectedFiles).toEqual(actualFiles);
-  });
-
-  afterAll(async () => {
-    await nodeFS.rm(tempDir, { recursive: true });
-  });
-});
diff --git a/packages/core/src/tests/llms/openai/utils.test.ts b/packages/core/src/tests/llms/openai/utils.test.ts
deleted file mode 100644
index 5ebace03d8201810e71ba6ae9c92ec6303de7c20..0000000000000000000000000000000000000000
--- a/packages/core/src/tests/llms/openai/utils.test.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import {
-  ALL_AVAILABLE_OPENAI_MODELS,
-  isFunctionCallingModel,
-} from "../../../llm";
-
-describe("openai/utils", () => {
-  test("shouldn't be a old model", () => {
-    expect(isFunctionCallingModel("gpt-3.5-turbo")).toBe(true);
-    expect(isFunctionCallingModel("gpt-3.5-turbo-0314")).toBe(false);
-    expect(isFunctionCallingModel("gpt-3.5-turbo-0301")).toBe(false);
-    expect(isFunctionCallingModel("gpt-3.5-turbo-0314-0301")).toBe(false);
-    expect(isFunctionCallingModel("gpt-3.5-turbo-0314-0301-0314-0301")).toBe(
-      false,
-    );
-    expect(
-      isFunctionCallingModel("gpt-3.5-turbo-0314-0301-0314-0301-0314-0301"),
-    ).toBe(false);
-  });
-
-  test("should be a open ai model", () => {
-    const models = Object.keys(ALL_AVAILABLE_OPENAI_MODELS).filter(
-      (model) => !model.includes("0314") && !model.includes("0301"),
-    );
-
-    models.forEach((model) => {
-      expect(isFunctionCallingModel(model)).toBe(true);
-    });
-  });
-});
diff --git a/packages/core/src/tests/utility/mockOpenAI.ts b/packages/core/src/tests/utility/mockOpenAI.ts
deleted file mode 100644
index aaa77d74306842d38dfe37a535ff086bb3089fd9..0000000000000000000000000000000000000000
--- a/packages/core/src/tests/utility/mockOpenAI.ts
+++ /dev/null
@@ -1,174 +0,0 @@
-import { CallbackManager } from "../../callbacks/CallbackManager";
-import { OpenAIEmbedding } from "../../embeddings";
-import { globalsHelper } from "../../GlobalsHelper";
-import { OpenAI } from "../../llm/LLM";
-import { LLMChatParamsBase } from "../../llm/types";
-
-export const DEFAULT_LLM_TEXT_OUTPUT = "MOCK_TOKEN_1-MOCK_TOKEN_2";
-
-export function mockLlmGeneration({
-  languageModel,
-  callbackManager,
-}: {
-  languageModel: OpenAI;
-  callbackManager?: CallbackManager;
-}) {
-  jest
-    .spyOn(languageModel, "chat")
-    .mockImplementation(
-      async ({ messages, parentEvent }: LLMChatParamsBase) => {
-        const text = DEFAULT_LLM_TEXT_OUTPUT;
-        const event = globalsHelper.createEvent({
-          parentEvent,
-          type: "llmPredict",
-        });
-        if (callbackManager?.onLLMStream) {
-          const chunks = text.split("-");
-          for (let i = 0; i < chunks.length; i++) {
-            const chunk = chunks[i];
-            callbackManager?.onLLMStream({
-              event,
-              index: i,
-              token: {
-                id: "id",
-                object: "object",
-                created: 1,
-                model: "model",
-                choices: [
-                  {
-                    index: 0,
-                    delta: {
-                      content: chunk,
-                    },
-                    finish_reason: null,
-                  },
-                ],
-              },
-            });
-          }
-          callbackManager?.onLLMStream({
-            event,
-            index: chunks.length,
-            isDone: true,
-          });
-        }
-        return new Promise((resolve) => {
-          resolve({
-            message: {
-              content: text,
-              role: "assistant",
-            },
-          });
-        });
-      },
-    );
-}
-
-export function mockLlmToolCallGeneration({
-  languageModel,
-  callbackManager,
-}: {
-  languageModel: OpenAI;
-  callbackManager: CallbackManager;
-}) {
-  jest.spyOn(languageModel, "chat").mockImplementation(
-    () =>
-      new Promise((resolve) =>
-        resolve({
-          message: {
-            content: "The sum is 2",
-            role: "assistant",
-          },
-        }),
-      ),
-  );
-}
-
-export function mockEmbeddingModel(
-  embedModel: OpenAIEmbedding,
-  embeddingsLength: number = 1,
-) {
-  jest.spyOn(embedModel, "getTextEmbedding").mockImplementation(async (x) => {
-    return new Promise((resolve) => {
-      resolve([1, 0, 0, 0, 0, 0]);
-    });
-  });
-  jest.spyOn(embedModel, "getTextEmbeddings").mockImplementation(async (x) => {
-    return new Promise((resolve) => {
-      if (x.length > 1) {
-        resolve(Array(x.length).fill([1, 0, 0, 0, 0, 0]));
-      }
-      resolve([[1, 0, 0, 0, 0, 0]]);
-    });
-  });
-  jest.spyOn(embedModel, "getQueryEmbedding").mockImplementation(async (x) => {
-    return new Promise((resolve) => {
-      resolve([0, 1, 0, 0, 0, 0]);
-    });
-  });
-}
-
-const structuredOutput = JSON.stringify([
-  {
-    choice: 1,
-    reason: "apple",
-  },
-]);
-
-export function mocStructuredkLlmGeneration({
-  languageModel,
-  callbackManager,
-}: {
-  languageModel: OpenAI;
-  callbackManager: CallbackManager;
-}) {
-  jest
-    .spyOn(languageModel, "chat")
-    .mockImplementation(
-      async ({ messages, parentEvent }: LLMChatParamsBase) => {
-        const text = structuredOutput;
-        const event = globalsHelper.createEvent({
-          parentEvent,
-          type: "llmPredict",
-        });
-        if (callbackManager?.onLLMStream) {
-          const chunks = text.split("-");
-          for (let i = 0; i < chunks.length; i++) {
-            const chunk = chunks[i];
-            callbackManager?.onLLMStream({
-              event,
-              index: i,
-              token: {
-                id: "id",
-                object: "object",
-                created: 1,
-                model: "model",
-                choices: [
-                  {
-                    index: 0,
-                    delta: {
-                      content: chunk,
-                    },
-                    finish_reason: null,
-                  },
-                ],
-              },
-            });
-          }
-          callbackManager?.onLLMStream({
-            event,
-            index: chunks.length,
-            isDone: true,
-          });
-        }
-        return new Promise((resolve) => {
-          resolve({
-            message: {
-              content: text,
-              role: "assistant",
-            },
-          });
-        });
-      },
-    );
-}
diff --git a/packages/core/src/tools/QueryEngineTool.ts b/packages/core/src/tools/QueryEngineTool.ts
index 41c0cc85be5f5c5e3bcc0b38cf1c14de58b53a13..fa3505f6cd3ebaaa962b8e4e3d7ba51f0153c7ae 100644
--- a/packages/core/src/tools/QueryEngineTool.ts
+++ b/packages/core/src/tools/QueryEngineTool.ts
@@ -1,4 +1,4 @@
-import { BaseQueryEngine, BaseTool, ToolMetadata } from "../types";
+import { BaseQueryEngine, BaseTool, ToolMetadata } from "../types.js";
 
 export type QueryEngineToolParams = {
   queryEngine: BaseQueryEngine;
diff --git a/packages/core/src/tools/functionTool.ts b/packages/core/src/tools/functionTool.ts
index f9114612929fb903c0fc379d91871a6258ef22a8..af3f50ca3919cb9ce299af4823cca475338b73b8 100644
--- a/packages/core/src/tools/functionTool.ts
+++ b/packages/core/src/tools/functionTool.ts
@@ -1,4 +1,4 @@
-import { BaseTool, ToolMetadata } from "../types";
+import { BaseTool, ToolMetadata } from "../types.js";
 
 type Metadata = {
   name: string;
diff --git a/packages/core/src/tools/index.ts b/packages/core/src/tools/index.ts
index bd695d4f9a66d5025807899554f0c05b0219c3d6..32e1bbb9d6c14b44be2566886c15d304fe1cad74 100644
--- a/packages/core/src/tools/index.ts
+++ b/packages/core/src/tools/index.ts
@@ -1,4 +1,4 @@
-export * from "./QueryEngineTool";
-export * from "./functionTool";
-export * from "./types";
-export * from "./utils";
+export * from "./QueryEngineTool.js";
+export * from "./functionTool.js";
+export * from "./types.js";
+export * from "./utils.js";
diff --git a/packages/core/src/tools/utils.ts b/packages/core/src/tools/utils.ts
index 8bb8e76176505cff3c63c91b6b9581282b9c8552..65bc25ab0eed5f664e51e4f7b47842253c96b4a4 100644
--- a/packages/core/src/tools/utils.ts
+++ b/packages/core/src/tools/utils.ts
@@ -1,5 +1,5 @@
-import { BaseTool } from "../types";
-import { ToolOutput } from "./types";
+import { BaseTool } from "../types.js";
+import { ToolOutput } from "./types.js";
 
 /**
  * Call tool with error handling.
diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts
index f71ee294d18fc3e777ed27f23f236ec191324ba3..d3d454524928ee6db09ce1ee88b263948197b1a4 100644
--- a/packages/core/src/types.ts
+++ b/packages/core/src/types.ts
@@ -1,8 +1,8 @@
 /**
  * Top level types to avoid circular dependencies
  */
-import { Event } from "./callbacks/CallbackManager";
-import { Response } from "./Response";
+import { Event } from "./callbacks/CallbackManager.js";
+import { Response } from "./Response.js";
 
 /**
  * Parameters for sending a query.
diff --git a/packages/core/src/tests/CallbackManager.test.ts b/packages/core/tests/CallbackManager.test.ts
similarity index 87%
rename from packages/core/src/tests/CallbackManager.test.ts
rename to packages/core/tests/CallbackManager.test.ts
index 8c150a34324375def15d2693003b012758a07795..ea4729741884eef5203a8777e8ef5f21f6621022 100644
--- a/packages/core/src/tests/CallbackManager.test.ts
+++ b/packages/core/tests/CallbackManager.test.ts
@@ -1,21 +1,37 @@
-import { Document } from "../Node";
-import { ServiceContext, serviceContextFromDefaults } from "../ServiceContext";
+import {
+  afterAll,
+  beforeAll,
+  beforeEach,
+  describe,
+  expect,
+  test,
+  vi,
+} from "vitest";
+
+import { Document } from "llamaindex/Node";
+import {
+  ServiceContext,
+  serviceContextFromDefaults,
+} from "llamaindex/ServiceContext";
 import {
   CallbackManager,
   RetrievalCallbackResponse,
   StreamCallbackResponse,
-} from "../callbacks/CallbackManager";
-import { OpenAIEmbedding } from "../embeddings";
-import { SummaryIndex } from "../indices/summary";
-import { VectorStoreIndex } from "../indices/vectorStore/VectorStoreIndex";
-import { OpenAI } from "../llm/LLM";
-import { ResponseSynthesizer, SimpleResponseBuilder } from "../synthesizers";
-import { mockEmbeddingModel, mockLlmGeneration } from "./utility/mockOpenAI";
+} from "llamaindex/callbacks/CallbackManager";
+import { OpenAIEmbedding } from "llamaindex/embeddings/index";
+import { SummaryIndex } from "llamaindex/indices/summary/index";
+import { VectorStoreIndex } from "llamaindex/indices/vectorStore/index";
+import { OpenAI } from "llamaindex/llm/LLM";
+import {
+  ResponseSynthesizer,
+  SimpleResponseBuilder,
+} from "llamaindex/synthesizers/index";
+import { mockEmbeddingModel, mockLlmGeneration } from "./utility/mockOpenAI.js";
 
 // Mock the OpenAI getOpenAISession function during testing
-jest.mock("../llm/open_ai", () => {
+vi.mock("llamaindex/llm/open_ai", () => {
   return {
-    getOpenAISession: jest.fn().mockImplementation(() => null),
+    getOpenAISession: vi.fn().mockImplementation(() => null),
   };
 });
 
@@ -58,7 +74,7 @@ describe("CallbackManager: onLLMStream and onRetrieve", () => {
   });
 
   afterAll(() => {
-    jest.clearAllMocks();
+    vi.clearAllMocks();
   });
 
   test("For VectorStoreIndex w/ a SimpleResponseBuilder", async () => {
diff --git a/packages/core/src/tests/Document.test.ts b/packages/core/tests/Document.test.ts
similarity index 63%
rename from packages/core/src/tests/Document.test.ts
rename to packages/core/tests/Document.test.ts
index a0edb65aecf12c84e7c8ec6cd298955259415150..73da731df47cc8b4c24d945049a144e7dd78e72d 100644
--- a/packages/core/src/tests/Document.test.ts
+++ b/packages/core/tests/Document.test.ts
@@ -1,4 +1,5 @@
-import { Document } from "../Node";
+import { Document } from "llamaindex/Node";
+import { describe, expect, test } from "vitest";
 
 describe("Document", () => {
   test("initializes", () => {
diff --git a/packages/core/src/tests/Embedding.test.ts b/packages/core/tests/Embedding.test.ts
similarity index 86%
rename from packages/core/src/tests/Embedding.test.ts
rename to packages/core/tests/Embedding.test.ts
index 5fa58a6024534a7e22ae446dddd1d23df13ec083..e0b2d2bf6915e34712147ef2a04bf268bb6f6f8e 100644
--- a/packages/core/src/tests/Embedding.test.ts
+++ b/packages/core/tests/Embedding.test.ts
@@ -1,10 +1,15 @@
-import { OpenAIEmbedding, similarity, SimilarityType } from "../embeddings";
-import { mockEmbeddingModel } from "./utility/mockOpenAI";
+import {
+  OpenAIEmbedding,
+  SimilarityType,
+  similarity,
+} from "llamaindex/embeddings/index";
+import { beforeAll, describe, expect, test, vi } from "vitest";
+import { mockEmbeddingModel } from "./utility/mockOpenAI.js";
 
 // Mock the OpenAI getOpenAISession function during testing
-jest.mock("../llm/open_ai", () => {
+vi.mock("llamaindex/llm/open_ai", () => {
   return {
-    getOpenAISession: jest.fn().mockImplementation(() => null),
+    getOpenAISession: vi.fn().mockImplementation(() => null),
   };
 });
 
diff --git a/packages/core/src/tests/Keyword.test.ts b/packages/core/tests/Keyword.test.ts
similarity index 96%
rename from packages/core/src/tests/Keyword.test.ts
rename to packages/core/tests/Keyword.test.ts
index e0571ba9f44fffc3b99433ccf3c22039a868765e..b5bf437351f932ea177d09dd1c2df5d814bd0fed 100644
--- a/packages/core/src/tests/Keyword.test.ts
+++ b/packages/core/tests/Keyword.test.ts
@@ -1,7 +1,8 @@
 import {
   rakeExtractKeywords,
   simpleExtractKeywords,
-} from "../indices/keyword/utils";
+} from "llamaindex/indices/keyword/utils";
+import { describe, expect, test } from "vitest";
 describe("SimpleExtractKeywords", () => {
   test("should extract unique keywords", () => {
     const text = "apple banana apple cherry";
diff --git a/packages/core/src/tests/MetadataExtractors.test.ts b/packages/core/tests/MetadataExtractors.test.ts
similarity index 84%
rename from packages/core/src/tests/MetadataExtractors.test.ts
rename to packages/core/tests/MetadataExtractors.test.ts
index e293f528d4d470ea4756663d8a0ea27728347104..af848c0682e5d50daa1345bba042d85da35ac02a 100644
--- a/packages/core/src/tests/MetadataExtractors.test.ts
+++ b/packages/core/tests/MetadataExtractors.test.ts
@@ -1,29 +1,41 @@
-import { Document } from "../Node";
-import { ServiceContext, serviceContextFromDefaults } from "../ServiceContext";
+import { Document } from "llamaindex/Node";
+import {
+  ServiceContext,
+  serviceContextFromDefaults,
+} from "llamaindex/ServiceContext";
 import {
   CallbackManager,
   RetrievalCallbackResponse,
   StreamCallbackResponse,
-} from "../callbacks/CallbackManager";
-import { OpenAIEmbedding } from "../embeddings";
+} from "llamaindex/callbacks/CallbackManager";
+import { OpenAIEmbedding } from "llamaindex/embeddings/index";
 import {
   KeywordExtractor,
   QuestionsAnsweredExtractor,
   SummaryExtractor,
   TitleExtractor,
-} from "../extractors";
-import { OpenAI } from "../llm/LLM";
-import { SimpleNodeParser } from "../nodeParsers";
+} from "llamaindex/extractors/index";
+import { OpenAI } from "llamaindex/llm/LLM";
+import { SimpleNodeParser } from "llamaindex/nodeParsers/index";
+import {
+  afterAll,
+  beforeAll,
+  beforeEach,
+  describe,
+  expect,
+  test,
+  vi,
+} from "vitest";
 import {
   DEFAULT_LLM_TEXT_OUTPUT,
   mockEmbeddingModel,
   mockLlmGeneration,
-} from "./utility/mockOpenAI";
+} from "./utility/mockOpenAI.js";
 
 // Mock the OpenAI getOpenAISession function during testing
-jest.mock("../llm/open_ai", () => {
+vi.mock("llamaindex/llm/open_ai", () => {
   return {
-    getOpenAISession: jest.fn().mockImplementation(() => null),
+    getOpenAISession: vi.fn().mockImplementation(() => null),
   };
 });
 
@@ -66,7 +78,7 @@ describe("[MetadataExtractor]: Extractors should populate the metadata", () => {
   });
 
   afterAll(() => {
-    jest.clearAllMocks();
+    vi.clearAllMocks();
   });
 
   test("[MetadataExtractor] KeywordExtractor returns excerptKeywords metadata", async () => {
diff --git a/packages/core/src/tests/Node.test.ts b/packages/core/tests/Node.test.ts
similarity index 79%
rename from packages/core/src/tests/Node.test.ts
rename to packages/core/tests/Node.test.ts
index 43768730ea2560b82d7e0d7c9637d5ba0090057d..34a65a2c2c2ad589b24d5ff41358a726bbfeeaae 100644
--- a/packages/core/src/tests/Node.test.ts
+++ b/packages/core/tests/Node.test.ts
@@ -1,4 +1,5 @@
-import { TextNode } from "../Node";
+import { TextNode } from "llamaindex/Node";
+import { beforeEach, describe, expect, test } from "vitest";
 
 describe("TextNode", () => {
   let node: TextNode;
diff --git a/packages/core/src/tests/OutputParser.test.ts b/packages/core/tests/OutputParser.test.ts
similarity index 95%
rename from packages/core/src/tests/OutputParser.test.ts
rename to packages/core/tests/OutputParser.test.ts
index 6ec61d4dc518fe27af06f9261da0e8b287329376..f092a78f2f7348d23ab3b8c8fb91d07e256b1e15 100644
--- a/packages/core/src/tests/OutputParser.test.ts
+++ b/packages/core/tests/OutputParser.test.ts
@@ -1,4 +1,5 @@
-import { SubQuestionOutputParser } from "../OutputParser";
+import { SubQuestionOutputParser } from "llamaindex/OutputParser";
+import { describe, expect, test } from "vitest";
 
 //This parser is really important, so make sure to add tests
 // as the parser sees through more iterations.
diff --git a/packages/core/src/tests/Selectors.test.ts b/packages/core/tests/Selectors.test.ts
similarity index 68%
rename from packages/core/src/tests/Selectors.test.ts
rename to packages/core/tests/Selectors.test.ts
index a615f03fbf9642151037b848d026054d5d17d0b0..2d4c2273413728d3990e58301819fdbdc84ec99b 100644
--- a/packages/core/src/tests/Selectors.test.ts
+++ b/packages/core/tests/Selectors.test.ts
@@ -1,13 +1,14 @@
+import { describe, expect, test, vi } from "vitest";
 // from unittest.mock import patch
 
-import { serviceContextFromDefaults } from "../ServiceContext";
-import { OpenAI } from "../llm";
-import { LLMSingleSelector } from "../selectors";
-import { mocStructuredkLlmGeneration } from "./utility/mockOpenAI";
+import { serviceContextFromDefaults } from "llamaindex/ServiceContext";
+import { OpenAI } from "llamaindex/llm/index";
+import { LLMSingleSelector } from "llamaindex/selectors/index";
+import { mocStructuredkLlmGeneration } from "./utility/mockOpenAI.js";
 
-jest.mock("../llm/open_ai", () => {
+vi.mock("llamaindex/llm/open_ai", () => {
   return {
-    getOpenAISession: jest.fn().mockImplementation(() => null),
+    getOpenAISession: vi.fn().mockImplementation(() => null),
   };
 });
 
diff --git a/packages/core/src/tests/StorageContext.test.ts b/packages/core/tests/StorageContext.test.ts
similarity index 53%
rename from packages/core/src/tests/StorageContext.test.ts
rename to packages/core/tests/StorageContext.test.ts
index dd16d0dd8794fbb621a50c9fdee16439cedfcd4b..c1702a90534907869f339d69873bc1329a49c981 100644
--- a/packages/core/src/tests/StorageContext.test.ts
+++ b/packages/core/tests/StorageContext.test.ts
@@ -1,11 +1,12 @@
-import { existsSync, rmSync } from "fs";
-import { storageContextFromDefaults } from "../storage/StorageContext";
+import { storageContextFromDefaults } from "llamaindex/storage/StorageContext";
+import { existsSync, rmSync } from "node:fs";
+import { describe, expect, test, vi, vitest } from "vitest";
 
-jest.spyOn(console, "error");
+vitest.spyOn(console, "error");
 
 describe("StorageContext", () => {
   test("initializes", async () => {
-    jest.mocked(console.error).mockImplementation(() => {}); // silence console.error
+    vi.mocked(console.error).mockImplementation(() => {}); // silence console.error
 
     const storageContext = await storageContextFromDefaults({
       persistDir: "/tmp/test_dir",
diff --git a/packages/core/src/tests/TextSplitter.test.ts b/packages/core/tests/TextSplitter.test.ts
similarity index 95%
rename from packages/core/src/tests/TextSplitter.test.ts
rename to packages/core/tests/TextSplitter.test.ts
index baa37cc995be3ca6006ab21672b2119c3c01ed75..90ae962a0578a2dc670a2f30e7cbbb7ff5f48b6e 100644
--- a/packages/core/src/tests/TextSplitter.test.ts
+++ b/packages/core/tests/TextSplitter.test.ts
@@ -1,4 +1,8 @@
-import { cjkSentenceTokenizer, SentenceSplitter } from "../TextSplitter";
+import {
+  SentenceSplitter,
+  cjkSentenceTokenizer,
+} from "llamaindex/TextSplitter";
+import { describe, expect, test } from "vitest";
 
 describe("SentenceSplitter", () => {
   test("initializes", () => {
diff --git a/packages/core/src/tests/VectorStore.test.ts b/packages/core/tests/VectorStore.test.ts
similarity index 90%
rename from packages/core/src/tests/VectorStore.test.ts
rename to packages/core/tests/VectorStore.test.ts
index 734a6aa56fc26f7be1d11eb8cc865d4b190035f9..290e1e992957d06c959dca869ab44ee27c4d0120 100644
--- a/packages/core/src/tests/VectorStore.test.ts
+++ b/packages/core/tests/VectorStore.test.ts
@@ -1,8 +1,9 @@
-import { Document, MetadataMode } from "../Node";
+import { Document, MetadataMode } from "llamaindex/Node";
 import {
   metadataDictToNode,
   nodeToMetadata,
-} from "../storage/vectorStore/utils";
+} from "llamaindex/storage/vectorStore/utils";
+import { beforeEach, describe, expect, test } from "vitest";
 
 describe("Testing VectorStore utils", () => {
   let node: Document;
diff --git a/packages/core/src/tests/agent/OpenAIAgent.test.ts b/packages/core/tests/agent/OpenAIAgent.test.ts
similarity index 76%
rename from packages/core/src/tests/agent/OpenAIAgent.test.ts
rename to packages/core/tests/agent/OpenAIAgent.test.ts
index 071740a0a96b44ee250b58b3f6161adcdd4b58be..f7f2edf66bee102ca62bbeefb827e0900ee327f3 100644
--- a/packages/core/src/tests/agent/OpenAIAgent.test.ts
+++ b/packages/core/tests/agent/OpenAIAgent.test.ts
@@ -1,8 +1,9 @@
-import { OpenAIAgent } from "../../agent";
-import { CallbackManager } from "../../callbacks/CallbackManager";
-import { OpenAI } from "../../llm";
-import { FunctionTool } from "../../tools";
-import { mockLlmToolCallGeneration } from "../utility/mockOpenAI";
+import { OpenAIAgent } from "llamaindex/agent/index";
+import { CallbackManager } from "llamaindex/callbacks/CallbackManager";
+import { OpenAI } from "llamaindex/llm/index";
+import { FunctionTool } from "llamaindex/tools/index";
+import { beforeEach, describe, expect, it, vi } from "vitest";
+import { mockLlmToolCallGeneration } from "../utility/mockOpenAI.js";
 
 // Define a function to sum two numbers
 function sumNumbers({ a, b }: { a: number; b: number }): number {
@@ -24,9 +25,9 @@ const sumJSON = {
   required: ["a", "b"],
 };
 
-jest.mock("../../llm/open_ai", () => {
+vi.mock("llamaindex/llm/open_ai", () => {
   return {
-    getOpenAISession: jest.fn().mockImplementation(() => null),
+    getOpenAISession: vi.fn().mockImplementation(() => null),
   };
 });
 
diff --git a/packages/core/src/tests/agent/runner/AgentRunner.test.ts b/packages/core/tests/agent/runner/AgentRunner.test.ts
similarity index 83%
rename from packages/core/src/tests/agent/runner/AgentRunner.test.ts
rename to packages/core/tests/agent/runner/AgentRunner.test.ts
index 27702ad9e687ddb030aa135e1f71b01636942a9e..ceed52ce3e30f55ea223e20e2fa7834ce00d047e 100644
--- a/packages/core/src/tests/agent/runner/AgentRunner.test.ts
+++ b/packages/core/tests/agent/runner/AgentRunner.test.ts
@@ -1,16 +1,17 @@
-import { OpenAIAgentWorker } from "../../../agent";
-import { AgentRunner } from "../../../agent/runner/base";
-import { CallbackManager } from "../../../callbacks/CallbackManager";
-import { OpenAI } from "../../../llm/LLM";
+import { OpenAIAgentWorker } from "llamaindex/agent/index";
+import { AgentRunner } from "llamaindex/agent/runner/base";
+import { CallbackManager } from "llamaindex/callbacks/CallbackManager";
+import { OpenAI } from "llamaindex/llm/LLM";
+import { beforeEach, describe, expect, it, vi } from "vitest";
 
 import {
   DEFAULT_LLM_TEXT_OUTPUT,
   mockLlmGeneration,
-} from "../../utility/mockOpenAI";
+} from "../../utility/mockOpenAI.js";
 
-jest.mock("../../../llm/open_ai", () => {
+vi.mock("llamaindex/llm/open_ai", () => {
   return {
-    getOpenAISession: jest.fn().mockImplementation(() => null),
+    getOpenAISession: vi.fn().mockImplementation(() => null),
   };
 });
 
diff --git a/packages/core/src/tests/ingestion/IngestionCache.test.ts b/packages/core/tests/ingestion/IngestionCache.test.ts
similarity index 89%
rename from packages/core/src/tests/ingestion/IngestionCache.test.ts
rename to packages/core/tests/ingestion/IngestionCache.test.ts
index bc4ee1733bd2b4b32484c65673c632f238860dd9..278ef53cf70e687002eae7c5dde891427f6bf38f 100644
--- a/packages/core/src/tests/ingestion/IngestionCache.test.ts
+++ b/packages/core/tests/ingestion/IngestionCache.test.ts
@@ -1,10 +1,11 @@
-import { BaseNode, TextNode } from "../../Node";
-import { TransformComponent } from "../../ingestion";
+import { BaseNode, TextNode } from "llamaindex/Node";
 import {
   IngestionCache,
   getTransformationHash,
-} from "../../ingestion/IngestionCache";
-import { SimpleNodeParser } from "../../nodeParsers";
+} from "llamaindex/ingestion/IngestionCache";
+import { TransformComponent } from "llamaindex/ingestion/index";
+import { SimpleNodeParser } from "llamaindex/nodeParsers/index";
+import { beforeAll, describe, expect, test } from "vitest";
 
 describe("IngestionCache", () => {
   let cache: IngestionCache;
diff --git a/packages/core/src/tests/mocks/TestableQdrantVectorStore.ts b/packages/core/tests/mocks/TestableQdrantVectorStore.ts
similarity index 80%
rename from packages/core/src/tests/mocks/TestableQdrantVectorStore.ts
rename to packages/core/tests/mocks/TestableQdrantVectorStore.ts
index c88ff3d5e331b8729e9643d82b8fb17864f4210c..306d0484641ccb83325d161f950d47936563a540 100644
--- a/packages/core/src/tests/mocks/TestableQdrantVectorStore.ts
+++ b/packages/core/tests/mocks/TestableQdrantVectorStore.ts
@@ -1,5 +1,5 @@
-import { BaseNode } from "../../Node";
-import { QdrantVectorStore } from "../../storage";
+import { BaseNode } from "llamaindex/Node";
+import { QdrantVectorStore } from "llamaindex/storage/index";
 
 export class TestableQdrantVectorStore extends QdrantVectorStore {
   public nodes: BaseNode[] = [];
diff --git a/packages/core/src/tests/nodeParsers/MarkdownNodeParser.test.ts b/packages/core/tests/nodeParsers/MarkdownNodeParser.test.ts
similarity index 92%
rename from packages/core/src/tests/nodeParsers/MarkdownNodeParser.test.ts
rename to packages/core/tests/nodeParsers/MarkdownNodeParser.test.ts
index 456b110d169301bd0e9defb58d6bc5827e6a23e0..b54272341c150cb1eb822dae21e9df414e705b13 100644
--- a/packages/core/src/tests/nodeParsers/MarkdownNodeParser.test.ts
+++ b/packages/core/tests/nodeParsers/MarkdownNodeParser.test.ts
@@ -1,5 +1,6 @@
-import { Document, MetadataMode } from "../../Node";
-import { MarkdownNodeParser } from "../../nodeParsers";
+import { Document, MetadataMode } from "llamaindex/Node";
+import { MarkdownNodeParser } from "llamaindex/nodeParsers/index";
+import { describe, expect, test } from "vitest";
 
 describe("MarkdownNodeParser", () => {
   test("test_header_splits", () => {
diff --git a/packages/core/src/tests/nodeParsers/SentenceWindowNodeParser.test.ts b/packages/core/tests/nodeParsers/SentenceWindowNodeParser.test.ts
similarity index 87%
rename from packages/core/src/tests/nodeParsers/SentenceWindowNodeParser.test.ts
rename to packages/core/tests/nodeParsers/SentenceWindowNodeParser.test.ts
index 143a01932752c1d126a1187a80c37159689baaa2..2ac5a1a3b61c14926dd63dc848bc5624ea53f570 100644
--- a/packages/core/src/tests/nodeParsers/SentenceWindowNodeParser.test.ts
+++ b/packages/core/tests/nodeParsers/SentenceWindowNodeParser.test.ts
@@ -1,8 +1,9 @@
-import { Document, MetadataMode } from "../../Node";
+import { Document, MetadataMode } from "llamaindex/Node";
 import {
   DEFAULT_WINDOW_METADATA_KEY,
   SentenceWindowNodeParser,
-} from "../../nodeParsers";
+} from "llamaindex/nodeParsers/index";
+import { describe, expect, test } from "vitest";
 
 describe("Tests for the SentenceWindowNodeParser class", () => {
   test("testing the constructor", () => {
diff --git a/packages/core/src/tests/nodeParsers/SimpleNodeParser.test.ts b/packages/core/tests/nodeParsers/SimpleNodeParser.test.ts
similarity index 87%
rename from packages/core/src/tests/nodeParsers/SimpleNodeParser.test.ts
rename to packages/core/tests/nodeParsers/SimpleNodeParser.test.ts
index 59eaad92fd6e16418140c60a911861a147eb280c..521d009f58bf737797bd37c7d52b6cac7a4cb8b1 100644
--- a/packages/core/src/tests/nodeParsers/SimpleNodeParser.test.ts
+++ b/packages/core/tests/nodeParsers/SimpleNodeParser.test.ts
@@ -1,5 +1,6 @@
-import { Document } from "../../Node";
-import { SimpleNodeParser } from "../../nodeParsers";
+import { Document } from "llamaindex/Node";
+import { SimpleNodeParser } from "llamaindex/nodeParsers/index";
+import { beforeEach, describe, expect, test } from "vitest";
 
 describe("SimpleNodeParser", () => {
   let simpleNodeParser: SimpleNodeParser;
diff --git a/packages/core/src/tests/objects/ObjectIndex.test.ts b/packages/core/tests/objects/ObjectIndex.test.ts
similarity index 90%
rename from packages/core/src/tests/objects/ObjectIndex.test.ts
rename to packages/core/tests/objects/ObjectIndex.test.ts
index b46616486e0e492150c016a9d8020fc64f3a0667..10a46e771b56d19b41960fd923b85cc659ddb1cf 100644
--- a/packages/core/src/tests/objects/ObjectIndex.test.ts
+++ b/packages/core/tests/objects/ObjectIndex.test.ts
@@ -7,12 +7,16 @@ import {
   SimpleToolNodeMapping,
   VectorStoreIndex,
   serviceContextFromDefaults,
-} from "../../index";
-import { mockEmbeddingModel, mockLlmGeneration } from "../utility/mockOpenAI";
+} from "llamaindex";
+import { beforeAll, describe, expect, test, vi } from "vitest";
+import {
+  mockEmbeddingModel,
+  mockLlmGeneration,
+} from "../utility/mockOpenAI.js";
 
-jest.mock("../../llm/open_ai", () => {
+vi.mock("llamaindex/llm/open_ai", () => {
   return {
-    getOpenAISession: jest.fn().mockImplementation(() => null),
+    getOpenAISession: vi.fn().mockImplementation(() => null),
   };
 });
 
diff --git a/packages/core/tests/package.json b/packages/core/tests/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..43e89c42fedc36198d3a62140268c58d8d86d10a
--- /dev/null
+++ b/packages/core/tests/package.json
@@ -0,0 +1,14 @@
+{
+  "name": "@llamaindex/core-test",
+  "private": true,
+  "type": "module",
+  "scripts": {
+    "test": "vitest run"
+  },
+  "dependencies": {
+    "llamaindex": "workspace:*"
+  },
+  "devDependencies": {
+    "vitest": "^1.3.1"
+  }
+}
diff --git a/packages/core/src/tests/postprocessors/MetadataReplacementPostProcessor.test.ts b/packages/core/tests/postprocessors/MetadataReplacementPostProcessor.test.ts
similarity index 82%
rename from packages/core/src/tests/postprocessors/MetadataReplacementPostProcessor.test.ts
rename to packages/core/tests/postprocessors/MetadataReplacementPostProcessor.test.ts
index 1e6f16c9d647648eb48f12c4b74185d533f6adf5..360b242c6feb757fda8e555ef476d798d8abe0c0 100644
--- a/packages/core/src/tests/postprocessors/MetadataReplacementPostProcessor.test.ts
+++ b/packages/core/tests/postprocessors/MetadataReplacementPostProcessor.test.ts
@@ -1,5 +1,6 @@
-import { MetadataMode, NodeWithScore, TextNode } from "../../Node";
-import { MetadataReplacementPostProcessor } from "../../postprocessors";
+import { MetadataMode, NodeWithScore, TextNode } from "llamaindex/Node";
+import { MetadataReplacementPostProcessor } from "llamaindex/postprocessors/index";
+import { beforeEach, describe, expect, test } from "vitest";
 
 describe("MetadataReplacementPostProcessor", () => {
   let postProcessor: MetadataReplacementPostProcessor;
diff --git a/packages/core/src/tests/prompts/Mixin.test.ts b/packages/core/tests/prompts/Mixin.test.ts
similarity index 96%
rename from packages/core/src/tests/prompts/Mixin.test.ts
rename to packages/core/tests/prompts/Mixin.test.ts
index ba9293ce619695f1accab8629776bf7a92c8cbd6..4af1976337b2268301cd88aabc833fa9bf554ce9 100644
--- a/packages/core/src/tests/prompts/Mixin.test.ts
+++ b/packages/core/tests/prompts/Mixin.test.ts
@@ -1,4 +1,5 @@
-import { PromptMixin } from "../../prompts";
+import { PromptMixin } from "llamaindex/prompts/index";
+import { describe, expect, it } from "vitest";
 
 type MockPrompt = {
   context: string;
diff --git a/packages/core/src/tests/readers/DocxReader.test.ts b/packages/core/tests/readers/DocxReader.test.ts
similarity index 73%
rename from packages/core/src/tests/readers/DocxReader.test.ts
rename to packages/core/tests/readers/DocxReader.test.ts
index dc6ae4eb912752e63bf47776feb27f5f9d71569f..4025d334857db87629d792ce94a8f62d2b7c93cf 100644
--- a/packages/core/src/tests/readers/DocxReader.test.ts
+++ b/packages/core/tests/readers/DocxReader.test.ts
@@ -1,4 +1,5 @@
-import { DocxReader } from "../../readers/DocxReader";
+import { DocxReader } from "llamaindex/readers/DocxReader";
+import { beforeEach, describe, expect, it } from "vitest";
 
 describe("DocxReader", () => {
   let docxReader: DocxReader;
@@ -9,7 +10,7 @@ describe("DocxReader", () => {
 
   describe("loadData", () => {
     it("should load data from a docx file, return an array of documents and contain text", async () => {
-      const filePath = "../../examples/data/stars.docx";
+      const filePath = "../../../examples/data/stars.docx";
       const docs = await docxReader.loadData(filePath);
       const docContent = docs.map((doc) => doc.text).join("");
 
diff --git a/packages/core/src/tests/readers/MarkdownReader.test.ts b/packages/core/tests/readers/MarkdownReader.test.ts
similarity index 73%
rename from packages/core/src/tests/readers/MarkdownReader.test.ts
rename to packages/core/tests/readers/MarkdownReader.test.ts
index 7ab4f22bec7789a88c6be1127d3dfef7cd2606c9..c95c25a9bb88bf5eb400111ce821a91d3f98a6a6 100644
--- a/packages/core/src/tests/readers/MarkdownReader.test.ts
+++ b/packages/core/tests/readers/MarkdownReader.test.ts
@@ -1,4 +1,5 @@
-import { MarkdownReader } from "../../readers/MarkdownReader";
+import { MarkdownReader } from "llamaindex/readers/MarkdownReader";
+import { beforeEach, describe, expect, it } from "vitest";
 
 describe("MarkdownReader", () => {
   let markdownReader: MarkdownReader;
@@ -9,7 +10,7 @@ describe("MarkdownReader", () => {
 
   describe("loadData", () => {
     it("should load data from a markdown file, return an array of documents and contain text", async () => {
-      const filePath = "../../examples/data/planets.md";
+      const filePath = "../../../examples/data/planets.md";
       const docs = await markdownReader.loadData(filePath);
       const docContent = docs.map((doc) => doc.text).join("");
 
diff --git a/packages/core/src/tests/tools/Tools.test.ts b/packages/core/tests/tools/Tools.test.ts
similarity index 82%
rename from packages/core/src/tests/tools/Tools.test.ts
rename to packages/core/tests/tools/Tools.test.ts
index 767a8608a910b7b00e8eab2e999c5505d1d56a0c..e2edfbe610322d89ae32a48ab5126831e7748150 100644
--- a/packages/core/src/tests/tools/Tools.test.ts
+++ b/packages/core/tests/tools/Tools.test.ts
@@ -1,5 +1,6 @@
-import { FunctionTool, ToolOutput } from "../../tools";
-import { callToolWithErrorHandling } from "../../tools/utils";
+import { FunctionTool, ToolOutput } from "llamaindex/tools/index";
+import { callToolWithErrorHandling } from "llamaindex/tools/utils";
+import { describe, expect, it } from "vitest";
 
 function sumNumbers({ a, b }: { a: number; b: number }): number {
   return a + b;
diff --git a/packages/core/tests/tsconfig.json b/packages/core/tests/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..6576baf06d4a003462ff40e8fa45a75900ef3f6a
--- /dev/null
+++ b/packages/core/tests/tsconfig.json
@@ -0,0 +1,10 @@
+{
+  "extends": "../../../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "./lib",
+    "module": "node16",
+    "moduleResolution": "node16",
+    "target": "ESNext"
+  },
+  "include": ["./**/*.ts"]
+}
diff --git a/packages/core/tests/utility/mockOpenAI.ts b/packages/core/tests/utility/mockOpenAI.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b2d684686c4db1eb48cc8d89105cc82707c1ea12
--- /dev/null
+++ b/packages/core/tests/utility/mockOpenAI.ts
@@ -0,0 +1,171 @@
+import { globalsHelper } from "llamaindex/GlobalsHelper";
+import { CallbackManager } from "llamaindex/callbacks/CallbackManager";
+import { OpenAIEmbedding } from "llamaindex/embeddings/index";
+import { OpenAI } from "llamaindex/llm/LLM";
+import { LLMChatParamsBase } from "llamaindex/llm/types";
+import { vi } from "vitest";
+
+export const DEFAULT_LLM_TEXT_OUTPUT = "MOCK_TOKEN_1-MOCK_TOKEN_2";
+
+export function mockLlmGeneration({
+  languageModel,
+  callbackManager,
+}: {
+  languageModel: OpenAI;
+  callbackManager?: CallbackManager;
+}) {
+  vi.spyOn(languageModel, "chat").mockImplementation(
+    async ({ messages, parentEvent }: LLMChatParamsBase) => {
+      const text = DEFAULT_LLM_TEXT_OUTPUT;
+      const event = globalsHelper.createEvent({
+        parentEvent,
+        type: "llmPredict",
+      });
+      if (callbackManager?.onLLMStream) {
+        const chunks = text.split("-");
+        for (let i = 0; i < chunks.length; i++) {
+          const chunk = chunks[i];
+          callbackManager?.onLLMStream({
+            event,
+            index: i,
+            token: {
+              id: "id",
+              object: "object",
+              created: 1,
+              model: "model",
+              choices: [
+                {
+                  index: 0,
+                  delta: {
+                    content: chunk,
+                  },
+                  finish_reason: null,
+                },
+              ],
+            },
+          });
+        }
+        callbackManager?.onLLMStream({
+          event,
+          index: chunks.length,
+          isDone: true,
+        });
+      }
+      return new Promise((resolve) => {
+        resolve({
+          message: {
+            content: text,
+            role: "assistant",
+          },
+        });
+      });
+    },
+  );
+}
+
+export function mockLlmToolCallGeneration({
+  languageModel,
+  callbackManager,
+}: {
+  languageModel: OpenAI;
+  callbackManager: CallbackManager;
+}) {
+  vi.spyOn(languageModel, "chat").mockImplementation(
+    () =>
+      new Promise((resolve) =>
+        resolve({
+          message: {
+            content: "The sum is 2",
+            role: "assistant",
+          },
+        }),
+      ),
+  );
+}
+
+export function mockEmbeddingModel(
+  embedModel: OpenAIEmbedding,
+  embeddingsLength: number = 1,
+) {
+  vi.spyOn(embedModel, "getTextEmbedding").mockImplementation(async (x) => {
+    return new Promise((resolve) => {
+      resolve([1, 0, 0, 0, 0, 0]);
+    });
+  });
+  vi.spyOn(embedModel, "getTextEmbeddings").mockImplementation(async (x) => {
+    return new Promise((resolve) => {
+      if (x.length > 1) {
+        resolve(Array(x.length).fill([1, 0, 0, 0, 0, 0]));
+      }
+      resolve([[1, 0, 0, 0, 0, 0]]);
+    });
+  });
+  vi.spyOn(embedModel, "getQueryEmbedding").mockImplementation(async (x) => {
+    return new Promise((resolve) => {
+      resolve([0, 1, 0, 0, 0, 0]);
+    });
+  });
+}
+
+const structuredOutput = JSON.stringify([
+  {
+    choice: 1,
+    reason: "apple",
+  },
+]);
+
+export function mocStructuredkLlmGeneration({
+  languageModel,
+  callbackManager,
+}: {
+  languageModel: OpenAI;
+  callbackManager: CallbackManager;
+}) {
+  vi.spyOn(languageModel, "chat").mockImplementation(
+    async ({ messages, parentEvent }: LLMChatParamsBase) => {
+      const text = structuredOutput;
+      const event = globalsHelper.createEvent({
+        parentEvent,
+        type: "llmPredict",
+      });
+      if (callbackManager?.onLLMStream) {
+        const chunks = text.split("-");
+        for (let i = 0; i < chunks.length; i++) {
+          const chunk = chunks[i];
+          callbackManager?.onLLMStream({
+            event,
+            index: i,
+            token: {
+              id: "id",
+              object: "object",
+              created: 1,
+              model: "model",
+              choices: [
+                {
+                  index: 0,
+                  delta: {
+                    content: chunk,
+                  },
+                  finish_reason: null,
+                },
+              ],
+            },
+          });
+        }
+        callbackManager?.onLLMStream({
+          event,
+          index: chunks.length,
+          isDone: true,
+        });
+      }
+      return new Promise((resolve) => {
+        resolve({
+          message: {
+            content: text,
+            role: "assistant",
+          },
+        });
+      });
+    },
+  );
+}
diff --git a/packages/core/src/tests/vectorStores/QdrantVectorStore.test.ts b/packages/core/tests/vectorStores/QdrantVectorStore.test.ts
similarity index 86%
rename from packages/core/src/tests/vectorStores/QdrantVectorStore.test.ts
rename to packages/core/tests/vectorStores/QdrantVectorStore.test.ts
index 01833e18380de93caf8eb96583c2ce8f32ecf868..67cda1b46d1d6b775526b43fad076a8bd035dad8 100644
--- a/packages/core/src/tests/vectorStores/QdrantVectorStore.test.ts
+++ b/packages/core/tests/vectorStores/QdrantVectorStore.test.ts
@@ -1,17 +1,18 @@
-import { BaseNode, TextNode } from "../../Node";
+import { BaseNode, TextNode } from "llamaindex/Node";
+import { Mocked, beforeEach, describe, expect, it, vi } from "vitest";
 
 import { QdrantClient } from "@qdrant/js-client-rest";
-import { VectorStoreQueryMode } from "../../storage";
-import { TestableQdrantVectorStore } from "../mocks/TestableQdrantVectorStore";
+import { VectorStoreQueryMode } from "llamaindex/storage/index";
+import { TestableQdrantVectorStore } from "../mocks/TestableQdrantVectorStore.js";
 
-jest.mock("@qdrant/js-client-rest");
+vi.mock("@qdrant/js-client-rest");
 
 describe("QdrantVectorStore", () => {
   let store: TestableQdrantVectorStore;
-  let mockQdrantClient: jest.Mocked<QdrantClient>;
+  let mockQdrantClient: Mocked<QdrantClient>;
 
   beforeEach(() => {
-    mockQdrantClient = new QdrantClient() as jest.Mocked<QdrantClient>;
+    mockQdrantClient = new QdrantClient() as Mocked<QdrantClient>;
     store = new TestableQdrantVectorStore({
       client: mockQdrantClient,
       collectionName: "testCollection",
@@ -41,11 +42,11 @@ describe("QdrantVectorStore", () => {
     describe("[QdrantVectorStore] add", () => {
       it("should add nodes to the vector store", async () => {
         // Mocking the dependent methods and Qdrant client responses
-        const mockInitializeCollection = jest
+        const mockInitializeCollection = vi
           .spyOn(store, "initializeCollection")
           .mockResolvedValue();
 
-        const mockBuildPoints = jest
+        const mockBuildPoints = vi
           .spyOn(store, "buildPoints")
           .mockResolvedValue({
             points: [{ id: "1", payload: {}, vector: [0.1, 0.2] }],
@@ -78,9 +79,9 @@ describe("QdrantVectorStore", () => {
 
     describe("[QdrantVectorStore] delete", () => {
       it("should delete from the vector store", async () => {
-        jest.spyOn(store, "initializeCollection").mockResolvedValue();
+        vi.spyOn(store, "initializeCollection").mockResolvedValue();
 
-        jest.spyOn(store, "buildPoints").mockResolvedValue({
+        vi.spyOn(store, "buildPoints").mockResolvedValue({
           points: [{ id: "1", payload: {}, vector: [0.1, 0.2] }],
           ids: ["1"],
         });
diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json
index 8ef1bfbe6d0c747563a7ec7654efa1c1b614a4ac..535cfc3a83c8e883b8d117b454ecd03639d960f7 100644
--- a/packages/core/tsconfig.json
+++ b/packages/core/tsconfig.json
@@ -1,18 +1,16 @@
 {
   "compilerOptions": {
-    "rootDir": ".",
-    "outDir": "./lib/",
+    "rootDir": "./src",
+    "outDir": "./dist/type",
+    "declaration": true,
     "esModuleInterop": true,
     "forceConsistentCasingInFileNames": true,
-    "isolatedModules": true,
-    "module": "esnext",
-    "moduleResolution": "node",
-    "preserveWatchOutput": true,
+    "module": "node16",
+    "moduleResolution": "node16",
     "skipLibCheck": true,
     "strict": true,
-    "lib": ["es2015", "dom"],
-    "target": "ES2015",
-    "resolveJsonModule": true
+    "lib": ["ESNext", "dom"],
+    "target": "ESNext"
   },
   "include": ["./src"],
   "exclude": ["node_modules"]
diff --git a/packages/env/.cjs.swcrc b/packages/env/.cjs.swcrc
new file mode 100644
index 0000000000000000000000000000000000000000..14193839df49abbada7bcc60e6fe4bc73a477b42
--- /dev/null
+++ b/packages/env/.cjs.swcrc
@@ -0,0 +1,11 @@
+{
+  "jsc": {
+    "parser": {
+      "syntax": "typescript"
+    },
+    "target": "esnext"
+  },
+  "module": {
+    "type": "commonjs"
+  }
+}
diff --git a/packages/env/.swcrc b/packages/env/.swcrc
new file mode 100644
index 0000000000000000000000000000000000000000..60e144e7209dd5b8297d793f22a7a9c1cc49c215
--- /dev/null
+++ b/packages/env/.swcrc
@@ -0,0 +1,8 @@
+{
+  "jsc": {
+    "parser": {
+      "syntax": "typescript"
+    },
+    "target": "esnext"
+  }
+}
diff --git a/packages/env/package.json b/packages/env/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..02a07b9bd6ba177ea8e0a45a731983b2717f4979
--- /dev/null
+++ b/packages/env/package.json
@@ -0,0 +1,61 @@
+{
+  "name": "@llamaindex/env",
+  "description": "environment wrapper",
+  "version": "0.0.1",
+  "type": "module",
+  "types": "dist/type/index.d.ts",
+  "main": "dist/cjs/index.cjs",
+  "exports": {
+    ".": {
+      "workerd": {
+        "types": "./dist/type/index.d.ts",
+        "default": "./dist/index.polyfill.js"
+      },
+      "edge-light": {
+        "types": "./dist/type/index.d.ts",
+        "default": "./dist/index.polyfill.js"
+      },
+      "import": {
+        "types": "./dist/type/index.d.ts",
+        "default": "./dist/index.js"
+      },
+      "require": {
+        "types": "./dist/type/index.d.ts",
+        "default": "./dist/cjs/index.cjs"
+      }
+    },
+    "./*": {
+      "import": {
+        "types": "./dist/type/*.d.ts",
+        "default": "./dist/*.js"
+      },
+      "require": {
+        "types": "./dist/type/*.d.ts",
+        "default": "./dist/cjs/*.js"
+      }
+    }
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/himself65/LlamaIndexTS.git",
+    "directory": "packages/env"
+  },
+  "scripts": {
+    "build": "rm -rf ./dist && pnpm run build:esm && pnpm run build:cjs && pnpm run build:type",
+    "build:esm": "swc src -d dist --strip-leading-paths --config-file .swcrc",
+    "build:cjs": "swc src -d dist/cjs --strip-leading-paths --config-file .cjs.swcrc --out-file-extension cjs",
+    "build:type": "tsc -p tsconfig.json",
+    "dev": "concurrently \"pnpm run build:esm --watch\" \"pnpm run build:cjs --watch\" \"pnpm run build:type --watch\""
+  },
+  "devDependencies": {
+    "@aws-crypto/sha256-js": "^5.2.0",
+    "@swc/cli": "^0.3.9",
+    "@swc/core": "^1.4.2",
+    "@types/lodash": "^4.14.202",
+    "@types/node": "^20.11.20",
+    "pathe": "^1.1.2"
+  },
+  "dependencies": {
+    "lodash": "^4.17.21"
+  }
+}
diff --git a/packages/core/src/env/index.edge-light.ts b/packages/env/src/index.polyfill.ts
similarity index 92%
rename from packages/core/src/env/index.edge-light.ts
rename to packages/env/src/index.polyfill.ts
index 522fcca3e3b4cdc2d5982aa2af9b2a30504ad55d..db252082031d278acb2173396b5cd2604193a50c 100644
--- a/packages/core/src/env/index.edge-light.ts
+++ b/packages/env/src/index.polyfill.ts
@@ -1,6 +1,6 @@
 import { Sha256 } from "@aws-crypto/sha256-js";
 import pathe from "pathe";
-import { CompleteFileSystem, InMemoryFileSystem } from "../storage";
+import { CompleteFileSystem, InMemoryFileSystem } from "./type.js";
 
 export { pathe as path };
 
diff --git a/packages/core/src/env/index.ts b/packages/env/src/index.ts
similarity index 89%
rename from packages/core/src/env/index.ts
rename to packages/env/src/index.ts
index 286efe6836f3342773ec5e9e68b41fa08028babd..9ab472d92af6a888e71350d3a84e02117335390c 100644
--- a/packages/core/src/env/index.ts
+++ b/packages/env/src/index.ts
@@ -3,8 +3,8 @@ import { createHash, randomUUID } from "node:crypto";
 import fs from "node:fs/promises";
 import { EOL } from "node:os";
 import path from "node:path";
-import type { CompleteFileSystem } from "../storage";
-import type { SHA256 } from "./index.edge-light";
+import type { SHA256 } from "./index.polyfill.js";
+import type { CompleteFileSystem } from "./type.js";
 
 export function createSHA256(): SHA256 {
   const hash = createHash("sha256");
diff --git a/packages/env/src/type.ts b/packages/env/src/type.ts
new file mode 100644
index 0000000000000000000000000000000000000000..00fb0a613dbde09f39a3d38cdbfc4d18bb95ca2c
--- /dev/null
+++ b/packages/env/src/type.ts
@@ -0,0 +1,77 @@
+import _ from "lodash";
+
+/**
+ * A filesystem interface that is meant to be compatible with
+ * the 'fs' module from Node.js.
+ * Allows for the use of similar inteface implementation on
+ * browsers.
+ */
+export type GenericFileSystem = {
+  writeFile(path: string, content: string): Promise<void>;
+  /**
+   * Reads a file and returns its content as a raw buffer.
+   */
+  readRawFile(path: string): Promise<Buffer>;
+  /**
+   * Reads a file and returns its content as an utf-8 string.
+   */
+  readFile(path: string): Promise<string>;
+  access(path: string): Promise<void>;
+  mkdir(
+    path: string,
+    options: {
+      recursive: boolean;
+    },
+  ): Promise<string | undefined>;
+  mkdir(path: string): Promise<void>;
+};
+export type WalkableFileSystem = {
+  readdir(path: string): Promise<string[]>;
+  stat(path: string): Promise<any>;
+};
+export type CompleteFileSystem = GenericFileSystem & WalkableFileSystem;
+
+/**
+ * A filesystem implementation that stores files in memory.
+ */
+export class InMemoryFileSystem implements CompleteFileSystem {
+  private files: Record<string, any> = {};
+
+  async writeFile(
+    path: string,
+    content: string,
+    options?: unknown,
+  ): Promise<void> {
+    this.files[path] = _.cloneDeep(content);
+  }
+
+  async readFile(path: string): Promise<string> {
+    if (!(path in this.files)) {
+      throw new Error(`File ${path} does not exist`);
+    }
+    return _.cloneDeep(this.files[path]);
+  }
+
+  async access(path: string): Promise<void> {
+    if (!(path in this.files)) {
+      throw new Error(`File ${path} does not exist`);
+    }
+  }
+
+  async mkdir(path: string) {
+    this.files[path] = _.get(this.files, path, null);
+    return undefined;
+  }
+
+  async readdir(path: string): Promise<string[]> {
+    throw new Error("Not implemented");
+  }
+
+  async stat(path: string): Promise<any> {
+    throw new Error("Not implemented");
+  }
+
+  async readRawFile(path: string): Promise<Buffer> {
+    throw new Error("Not implemented");
+  }
+}
diff --git a/packages/env/tsconfig.json b/packages/env/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..419912df410d8c10eb89f4f88c80ffc0fc75640a
--- /dev/null
+++ b/packages/env/tsconfig.json
@@ -0,0 +1,18 @@
+{
+  "compilerOptions": {
+    "rootDir": "./src",
+    "outDir": "./dist/type",
+    "declaration": true,
+    "esModuleInterop": true,
+    "forceConsistentCasingInFileNames": true,
+    "module": "node16",
+    "moduleResolution": "node16",
+    "skipLibCheck": true,
+    "strict": true,
+    "lib": ["ESNext", "dom"],
+    "types": ["node"],
+    "target": "ESNext"
+  },
+  "include": ["./src"],
+  "exclude": ["node_modules"]
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9b853adf3fc860bbfb56bd2ffde3010f3f777777..bc0f6a230ce71450e085bb2b05d5c59866843fba 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -15,9 +15,6 @@ importers:
       '@changesets/cli':
         specifier: ^2.27.1
         version: 2.27.1
-      '@types/jest':
-        specifier: ^29.5.12
-        version: 29.5.12
       eslint:
         specifier: ^8.56.0
         version: 8.56.0
@@ -27,9 +24,6 @@ importers:
       husky:
         specifier: ^9.0.10
         version: 9.0.10
-      jest:
-        specifier: ^29.7.0
-        version: 29.7.0
       lint-staged:
         specifier: ^15.2.2
         version: 15.2.2
@@ -39,9 +33,6 @@ importers:
       prettier-plugin-organize-imports:
         specifier: ^3.2.4
         version: 3.2.4(prettier@3.2.5)(typescript@5.3.3)
-      ts-jest:
-        specifier: ^29.1.2
-        version: 29.1.2(@babel/core@7.23.9)(jest@29.7.0)(typescript@5.3.3)
       turbo:
         specifier: ^1.12.3
         version: 1.12.3
@@ -168,9 +159,18 @@ importers:
       '@anthropic-ai/sdk':
         specifier: ^0.13.0
         version: 0.13.0
+      '@aws-crypto/sha256-js':
+        specifier: ^5.2.0
+        version: 5.2.0
       '@datastax/astra-db-ts':
         specifier: ^0.1.4
         version: 0.1.4
+      '@llamaindex/cloud':
+        specifier: ^0.0.1
+        version: 0.0.1
+      '@llamaindex/env':
+        specifier: workspace:*
+        version: link:../env
       '@mistralai/mistralai':
         specifier: ^0.0.10
         version: 0.0.10
@@ -250,18 +250,12 @@ importers:
         specifier: ^1.14.3
         version: 1.14.3
     devDependencies:
-      '@aws-crypto/sha256-js':
-        specifier: ^5.2.0
-        version: 5.2.0
-      '@llamaindex/cloud':
-        specifier: ^0.0.1
-        version: 0.0.1
-      '@types/edit-json-file':
-        specifier: ^1.7.3
-        version: 1.7.3
-      '@types/jest':
-        specifier: ^29.5.12
-        version: 29.5.12
+      '@swc/cli':
+        specifier: ^0.3.9
+        version: 0.3.9(@swc/core@1.4.2)
+      '@swc/core':
+        specifier: ^1.4.2
+        version: 1.4.2
       '@types/lodash':
         specifier: ^4.14.202
         version: 4.14.202
@@ -274,12 +268,12 @@ importers:
       '@types/pg':
         specifier: ^8.11.0
         version: 8.11.0
-      bunchee:
-        specifier: ^4.4.6
-        version: 4.4.6(typescript@5.3.3)
-      edit-json-file:
-        specifier: ^1.8.0
-        version: 1.8.0
+      concurrently:
+        specifier: ^8.2.2
+        version: 8.2.2
+      glob:
+        specifier: ^10.3.10
+        version: 10.3.10
       madge:
         specifier: ^6.1.0
         version: 6.1.0(typescript@5.3.3)
@@ -287,6 +281,16 @@ importers:
         specifier: ^5.3.3
         version: 5.3.3
 
+  packages/core/tests:
+    dependencies:
+      llamaindex:
+        specifier: workspace:*
+        version: link:..
+    devDependencies:
+      vitest:
+        specifier: ^1.3.1
+        version: 1.3.1
+
   packages/create-llama:
     devDependencies:
       '@playwright/test':
@@ -368,6 +372,31 @@ importers:
         specifier: ^1.1.0
         version: 1.1.0
 
+  packages/env:
+    dependencies:
+      lodash:
+        specifier: ^4.17.21
+        version: 4.17.21
+    devDependencies:
+      '@aws-crypto/sha256-js':
+        specifier: ^5.2.0
+        version: 5.2.0
+      '@swc/cli':
+        specifier: ^0.3.9
+        version: 0.3.9(@swc/core@1.4.2)
+      '@swc/core':
+        specifier: ^1.4.2
+        version: 1.4.2
+      '@types/lodash':
+        specifier: ^4.14.202
+        version: 4.14.202
+      '@types/node':
+        specifier: ^20.11.20
+        version: 20.11.20
+      pathe:
+        specifier: ^1.1.2
+        version: 1.1.2
+
   packages/eslint-config-custom:
     dependencies:
       eslint-config-next:
@@ -385,7 +414,7 @@ importers:
     devDependencies:
       next:
         specifier: ^13.5.6
-        version: 13.5.6(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0)
+        version: 13.5.6(react-dom@18.2.0)(react@18.2.0)
 
   packages/tsconfig: {}
 
@@ -563,7 +592,6 @@ packages:
       '@aws-crypto/util': 5.2.0
       '@aws-sdk/types': 3.496.0
       tslib: 2.6.2
-    dev: true
 
   /@aws-crypto/util@5.2.0:
     resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==}
@@ -571,7 +599,6 @@ packages:
       '@aws-sdk/types': 3.496.0
       '@smithy/util-utf8': 2.1.1
       tslib: 2.6.2
-    dev: true
 
   /@aws-sdk/types@3.496.0:
     resolution: {integrity: sha512-umkGadK4QuNQaMoDICMm7NKRI/mYSXiyPjcn3d53BhsuArYU/52CebGQKdt4At7SwwsiVJZw9RNBHyN5Mm0HVw==}
@@ -579,7 +606,6 @@ packages:
     dependencies:
       '@smithy/types': 2.9.1
       tslib: 2.6.2
-    dev: true
 
   /@babel/code-frame@7.23.5:
     resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==}
@@ -878,15 +904,6 @@ packages:
       '@babel/core': 7.23.9
       '@babel/helper-plugin-utils': 7.22.5
 
-  /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9):
-    resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.23.9
-      '@babel/helper-plugin-utils': 7.22.5
-    dev: true
-
   /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9):
     resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
     peerDependencies:
@@ -1795,10 +1812,6 @@ packages:
       '@babel/helper-validator-identifier': 7.22.20
       to-fast-properties: 2.0.0
 
-  /@bcoe/v8-coverage@0.2.3:
-    resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
-    dev: true
-
   /@changesets/apply-release-plan@7.0.0:
     resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==}
     dependencies:
@@ -2895,6 +2908,213 @@ packages:
       - uglify-js
       - webpack-cli
 
+  /@esbuild/aix-ppc64@0.19.12:
+    resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [aix]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm64@0.19.12:
+    resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm@0.19.12:
+    resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-x64@0.19.12:
+    resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-arm64@0.19.12:
+    resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-x64@0.19.12:
+    resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-arm64@0.19.12:
+    resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-x64@0.19.12:
+    resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm64@0.19.12:
+    resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm@0.19.12:
+    resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ia32@0.19.12:
+    resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-loong64@0.19.12:
+    resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-mips64el@0.19.12:
+    resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ppc64@0.19.12:
+    resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-riscv64@0.19.12:
+    resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-s390x@0.19.12:
+    resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-x64@0.19.12:
+    resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/netbsd-x64@0.19.12:
+    resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/openbsd-x64@0.19.12:
+    resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/sunos-x64@0.19.12:
+    resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-arm64@0.19.12:
+    resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32@0.19.12:
+    resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-x64@0.19.12:
+    resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0):
     resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -2933,10 +3153,6 @@ packages:
     engines: {node: '>=14'}
     dev: false
 
-  /@fastify/deepmerge@1.3.0:
-    resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==}
-    dev: true
-
   /@hapi/hoek@9.3.0:
     resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
 
@@ -2979,241 +3195,30 @@ packages:
       wrap-ansi-cjs: /wrap-ansi@7.0.0
     dev: true
 
-  /@istanbuljs/load-nyc-config@1.1.0:
-    resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
-    engines: {node: '>=8'}
-    dependencies:
-      camelcase: 5.3.1
-      find-up: 4.1.0
-      get-package-type: 0.1.0
-      js-yaml: 3.14.1
-      resolve-from: 5.0.0
-    dev: true
-
-  /@istanbuljs/schema@0.1.3:
-    resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /@jest/console@29.7.0:
-    resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==}
+  /@jest/schemas@29.6.3:
+    resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 29.6.3
-      '@types/node': 20.11.17
-      chalk: 4.1.2
-      jest-message-util: 29.7.0
-      jest-util: 29.7.0
-      slash: 3.0.0
-    dev: true
+      '@sinclair/typebox': 0.27.8
 
-  /@jest/core@29.7.0:
-    resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==}
+  /@jest/types@29.6.3:
+    resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
     dependencies:
-      '@jest/console': 29.7.0
-      '@jest/reporters': 29.7.0
-      '@jest/test-result': 29.7.0
-      '@jest/transform': 29.7.0
-      '@jest/types': 29.6.3
+      '@jest/schemas': 29.6.3
+      '@types/istanbul-lib-coverage': 2.0.6
+      '@types/istanbul-reports': 3.0.4
       '@types/node': 20.11.17
-      ansi-escapes: 4.3.2
+      '@types/yargs': 17.0.32
       chalk: 4.1.2
-      ci-info: 3.9.0
-      exit: 0.1.2
-      graceful-fs: 4.2.11
-      jest-changed-files: 29.7.0
-      jest-config: 29.7.0(@types/node@20.11.17)
-      jest-haste-map: 29.7.0
-      jest-message-util: 29.7.0
-      jest-regex-util: 29.6.3
-      jest-resolve: 29.7.0
-      jest-resolve-dependencies: 29.7.0
-      jest-runner: 29.7.0
-      jest-runtime: 29.7.0
-      jest-snapshot: 29.7.0
-      jest-util: 29.7.0
-      jest-validate: 29.7.0
-      jest-watcher: 29.7.0
-      micromatch: 4.0.5
-      pretty-format: 29.7.0
-      slash: 3.0.0
-      strip-ansi: 6.0.1
-    transitivePeerDependencies:
-      - babel-plugin-macros
-      - supports-color
-      - ts-node
-    dev: true
 
-  /@jest/environment@29.7.0:
-    resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  /@jridgewell/gen-mapping@0.3.3:
+    resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
+    engines: {node: '>=6.0.0'}
     dependencies:
-      '@jest/fake-timers': 29.7.0
-      '@jest/types': 29.6.3
-      '@types/node': 20.11.17
-      jest-mock: 29.7.0
-    dev: true
-
-  /@jest/expect-utils@29.7.0:
-    resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      jest-get-type: 29.6.3
-    dev: true
-
-  /@jest/expect@29.7.0:
-    resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      expect: 29.7.0
-      jest-snapshot: 29.7.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@jest/fake-timers@29.7.0:
-    resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/types': 29.6.3
-      '@sinonjs/fake-timers': 10.3.0
-      '@types/node': 20.11.17
-      jest-message-util: 29.7.0
-      jest-mock: 29.7.0
-      jest-util: 29.7.0
-    dev: true
-
-  /@jest/globals@29.7.0:
-    resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/environment': 29.7.0
-      '@jest/expect': 29.7.0
-      '@jest/types': 29.6.3
-      jest-mock: 29.7.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@jest/reporters@29.7.0:
-    resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
-    dependencies:
-      '@bcoe/v8-coverage': 0.2.3
-      '@jest/console': 29.7.0
-      '@jest/test-result': 29.7.0
-      '@jest/transform': 29.7.0
-      '@jest/types': 29.6.3
-      '@jridgewell/trace-mapping': 0.3.22
-      '@types/node': 20.11.17
-      chalk: 4.1.2
-      collect-v8-coverage: 1.0.2
-      exit: 0.1.2
-      glob: 7.2.3
-      graceful-fs: 4.2.11
-      istanbul-lib-coverage: 3.2.2
-      istanbul-lib-instrument: 6.0.1
-      istanbul-lib-report: 3.0.1
-      istanbul-lib-source-maps: 4.0.1
-      istanbul-reports: 3.1.6
-      jest-message-util: 29.7.0
-      jest-util: 29.7.0
-      jest-worker: 29.7.0
-      slash: 3.0.0
-      string-length: 4.0.2
-      strip-ansi: 6.0.1
-      v8-to-istanbul: 9.2.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@jest/schemas@29.6.3:
-    resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@sinclair/typebox': 0.27.8
-
-  /@jest/source-map@29.6.3:
-    resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jridgewell/trace-mapping': 0.3.22
-      callsites: 3.1.0
-      graceful-fs: 4.2.11
-    dev: true
-
-  /@jest/test-result@29.7.0:
-    resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/console': 29.7.0
-      '@jest/types': 29.6.3
-      '@types/istanbul-lib-coverage': 2.0.6
-      collect-v8-coverage: 1.0.2
-    dev: true
-
-  /@jest/test-sequencer@29.7.0:
-    resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/test-result': 29.7.0
-      graceful-fs: 4.2.11
-      jest-haste-map: 29.7.0
-      slash: 3.0.0
-    dev: true
-
-  /@jest/transform@29.7.0:
-    resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@babel/core': 7.23.9
-      '@jest/types': 29.6.3
-      '@jridgewell/trace-mapping': 0.3.22
-      babel-plugin-istanbul: 6.1.1
-      chalk: 4.1.2
-      convert-source-map: 2.0.0
-      fast-json-stable-stringify: 2.1.0
-      graceful-fs: 4.2.11
-      jest-haste-map: 29.7.0
-      jest-regex-util: 29.6.3
-      jest-util: 29.7.0
-      micromatch: 4.0.5
-      pirates: 4.0.6
-      slash: 3.0.0
-      write-file-atomic: 4.0.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@jest/types@29.6.3:
-    resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/schemas': 29.6.3
-      '@types/istanbul-lib-coverage': 2.0.6
-      '@types/istanbul-reports': 3.0.4
-      '@types/node': 20.11.17
-      '@types/yargs': 17.0.32
-      chalk: 4.1.2
-
-  /@jridgewell/gen-mapping@0.3.3:
-    resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
-    engines: {node: '>=6.0.0'}
-    dependencies:
-      '@jridgewell/set-array': 1.1.2
-      '@jridgewell/sourcemap-codec': 1.4.15
-      '@jridgewell/trace-mapping': 0.3.22
+      '@jridgewell/set-array': 1.1.2
+      '@jridgewell/sourcemap-codec': 1.4.15
+      '@jridgewell/trace-mapping': 0.3.22
 
   /@jridgewell/resolve-uri@3.1.1:
     resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
@@ -3250,7 +3255,7 @@ packages:
 
   /@llamaindex/cloud@0.0.1:
     resolution: {integrity: sha512-7FrLAbY459B4rcG4NaqANatDT5zKvZxIRyrY+nnTSXqu9ZMzkm1Co8IIRYx2/9feps/OLOhXsv7VKGGUr7scNQ==}
-    dev: true
+    dev: false
 
   /@manypkg/find-root@1.1.0:
     resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
@@ -3319,6 +3324,20 @@ packages:
       - encoding
     dev: false
 
+  /@mole-inc/bin-wrapper@8.0.1:
+    resolution: {integrity: sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dependencies:
+      bin-check: 4.1.0
+      bin-version-check: 5.1.0
+      content-disposition: 0.5.4
+      ext-name: 5.0.0
+      file-type: 17.1.6
+      filenamify: 5.1.1
+      got: 11.8.6
+      os-filter-obj: 2.0.0
+    dev: true
+
   /@mongodb-js/saslprep@1.1.1:
     resolution: {integrity: sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==}
     dependencies:
@@ -3560,195 +3579,104 @@ packages:
     engines: {node: '>=12.0.0', pnpm: '>=8'}
     dev: false
 
-  /@rollup/plugin-commonjs@25.0.7(rollup@4.9.5):
-    resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==}
-    engines: {node: '>=14.0.0'}
-    peerDependencies:
-      rollup: ^2.68.0||^3.0.0||^4.0.0
-    peerDependenciesMeta:
-      rollup:
-        optional: true
-    dependencies:
-      '@rollup/pluginutils': 5.1.0(rollup@4.9.5)
-      commondir: 1.0.1
-      estree-walker: 2.0.2
-      glob: 8.1.0
-      is-reference: 1.2.1
-      magic-string: 0.30.7
-      rollup: 4.9.5
-    dev: true
-
-  /@rollup/plugin-json@6.1.0(rollup@4.9.5):
-    resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==}
-    engines: {node: '>=14.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
-    peerDependenciesMeta:
-      rollup:
-        optional: true
-    dependencies:
-      '@rollup/pluginutils': 5.1.0(rollup@4.9.5)
-      rollup: 4.9.5
-    dev: true
-
-  /@rollup/plugin-node-resolve@15.2.3(rollup@4.9.5):
-    resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==}
-    engines: {node: '>=14.0.0'}
-    peerDependencies:
-      rollup: ^2.78.0||^3.0.0||^4.0.0
-    peerDependenciesMeta:
-      rollup:
-        optional: true
-    dependencies:
-      '@rollup/pluginutils': 5.1.0(rollup@4.9.5)
-      '@types/resolve': 1.20.2
-      deepmerge: 4.3.1
-      is-builtin-module: 3.2.1
-      is-module: 1.0.0
-      resolve: 1.22.8
-      rollup: 4.9.5
-    dev: true
-
-  /@rollup/plugin-replace@5.0.5(rollup@4.9.5):
-    resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==}
-    engines: {node: '>=14.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
-    peerDependenciesMeta:
-      rollup:
-        optional: true
-    dependencies:
-      '@rollup/pluginutils': 5.1.0(rollup@4.9.5)
-      magic-string: 0.30.7
-      rollup: 4.9.5
-    dev: true
-
-  /@rollup/plugin-wasm@6.2.2(rollup@4.9.5):
-    resolution: {integrity: sha512-gpC4R1G9Ni92ZIRTexqbhX7U+9estZrbhP+9SRb0DW9xpB9g7j34r+J2hqrcW/lRI7dJaU84MxZM0Rt82tqYPQ==}
-    engines: {node: '>=14.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
-    peerDependenciesMeta:
-      rollup:
-        optional: true
-    dependencies:
-      '@rollup/pluginutils': 5.1.0(rollup@4.9.5)
-      rollup: 4.9.5
-    dev: true
-
-  /@rollup/pluginutils@5.1.0(rollup@4.9.5):
-    resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
-    engines: {node: '>=14.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
-    peerDependenciesMeta:
-      rollup:
-        optional: true
-    dependencies:
-      '@types/estree': 1.0.5
-      estree-walker: 2.0.2
-      picomatch: 2.3.1
-      rollup: 4.9.5
-    dev: true
-
-  /@rollup/rollup-android-arm-eabi@4.9.5:
-    resolution: {integrity: sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==}
+  /@rollup/rollup-android-arm-eabi@4.12.0:
+    resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==}
     cpu: [arm]
     os: [android]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-android-arm64@4.9.5:
-    resolution: {integrity: sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==}
+  /@rollup/rollup-android-arm64@4.12.0:
+    resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==}
     cpu: [arm64]
     os: [android]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-darwin-arm64@4.9.5:
-    resolution: {integrity: sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==}
+  /@rollup/rollup-darwin-arm64@4.12.0:
+    resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==}
     cpu: [arm64]
     os: [darwin]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-darwin-x64@4.9.5:
-    resolution: {integrity: sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==}
+  /@rollup/rollup-darwin-x64@4.12.0:
+    resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==}
     cpu: [x64]
     os: [darwin]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-linux-arm-gnueabihf@4.9.5:
-    resolution: {integrity: sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==}
+  /@rollup/rollup-linux-arm-gnueabihf@4.12.0:
+    resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==}
     cpu: [arm]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-linux-arm64-gnu@4.9.5:
-    resolution: {integrity: sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==}
+  /@rollup/rollup-linux-arm64-gnu@4.12.0:
+    resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-linux-arm64-musl@4.9.5:
-    resolution: {integrity: sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==}
+  /@rollup/rollup-linux-arm64-musl@4.12.0:
+    resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-linux-riscv64-gnu@4.9.5:
-    resolution: {integrity: sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==}
+  /@rollup/rollup-linux-riscv64-gnu@4.12.0:
+    resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==}
     cpu: [riscv64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-linux-x64-gnu@4.9.5:
-    resolution: {integrity: sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==}
+  /@rollup/rollup-linux-x64-gnu@4.12.0:
+    resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-linux-x64-musl@4.9.5:
-    resolution: {integrity: sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==}
+  /@rollup/rollup-linux-x64-musl@4.12.0:
+    resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-win32-arm64-msvc@4.9.5:
-    resolution: {integrity: sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==}
+  /@rollup/rollup-win32-arm64-msvc@4.12.0:
+    resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==}
     cpu: [arm64]
     os: [win32]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-win32-ia32-msvc@4.9.5:
-    resolution: {integrity: sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==}
+  /@rollup/rollup-win32-ia32-msvc@4.12.0:
+    resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==}
     cpu: [ia32]
     os: [win32]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-win32-x64-msvc@4.9.5:
-    resolution: {integrity: sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==}
+  /@rollup/rollup-win32-x64-msvc@4.12.0:
+    resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==}
     cpu: [x64]
     os: [win32]
     requiresBuild: true
@@ -3794,18 +3722,6 @@ packages:
     resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
     engines: {node: '>=14.16'}
 
-  /@sinonjs/commons@3.0.1:
-    resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
-    dependencies:
-      type-detect: 4.0.8
-    dev: true
-
-  /@sinonjs/fake-timers@10.3.0:
-    resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
-    dependencies:
-      '@sinonjs/commons': 3.0.1
-    dev: true
-
   /@slorber/remark-comment@1.0.0:
     resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==}
     dependencies:
@@ -3826,14 +3742,12 @@ packages:
     engines: {node: '>=14.0.0'}
     dependencies:
       tslib: 2.6.2
-    dev: true
 
   /@smithy/types@2.9.1:
     resolution: {integrity: sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==}
     engines: {node: '>=14.0.0'}
     dependencies:
       tslib: 2.6.2
-    dev: true
 
   /@smithy/util-buffer-from@2.1.1:
     resolution: {integrity: sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==}
@@ -3841,7 +3755,6 @@ packages:
     dependencies:
       '@smithy/is-array-buffer': 2.1.1
       tslib: 2.6.2
-    dev: true
 
   /@smithy/util-utf8@2.1.1:
     resolution: {integrity: sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==}
@@ -3849,7 +3762,6 @@ packages:
     dependencies:
       '@smithy/util-buffer-from': 2.1.1
       tslib: 2.6.2
-    dev: true
 
   /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.9):
     resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==}
@@ -3990,8 +3902,31 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
-  /@swc/core-darwin-arm64@1.3.107:
-    resolution: {integrity: sha512-47tD/5vSXWxPd0j/ZllyQUg4bqalbQTsmqSw0J4dDdS82MWqCAwUErUrAZPRjBkjNQ6Kmrf5rpCWaGTtPw+ngw==}
+  /@swc/cli@0.3.9(@swc/core@1.4.2):
+    resolution: {integrity: sha512-e5grxGEyNT0fYZEFmhSrRYL1kFAZAXlv+WjfQ35J6J9Hl0EtrMVymAEbGabetg2Q/2FX6HiRcjgc9LrdUCBk4A==}
+    engines: {node: '>= 16.14.0'}
+    hasBin: true
+    peerDependencies:
+      '@swc/core': ^1.2.66
+      chokidar: ^3.5.1
+    peerDependenciesMeta:
+      chokidar:
+        optional: true
+    dependencies:
+      '@mole-inc/bin-wrapper': 8.0.1
+      '@swc/core': 1.4.2
+      '@swc/counter': 0.1.3
+      commander: 7.2.0
+      fast-glob: 3.3.1
+      minimatch: 9.0.3
+      piscina: 4.3.2
+      semver: 7.6.0
+      slash: 3.0.0
+      source-map: 0.7.4
+    dev: true
+
+  /@swc/core-darwin-arm64@1.4.2:
+    resolution: {integrity: sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==}
     engines: {node: '>=10'}
     cpu: [arm64]
     os: [darwin]
@@ -3999,8 +3934,8 @@ packages:
     dev: true
     optional: true
 
-  /@swc/core-darwin-x64@1.3.107:
-    resolution: {integrity: sha512-hwiLJ2ulNkBGAh1m1eTfeY1417OAYbRGcb/iGsJ+LuVLvKAhU/itzsl535CvcwAlt2LayeCFfcI8gdeOLeZa9A==}
+  /@swc/core-darwin-x64@1.4.2:
+    resolution: {integrity: sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==}
     engines: {node: '>=10'}
     cpu: [x64]
     os: [darwin]
@@ -4008,8 +3943,8 @@ packages:
     dev: true
     optional: true
 
-  /@swc/core-linux-arm-gnueabihf@1.3.107:
-    resolution: {integrity: sha512-I2wzcC0KXqh0OwymCmYwNRgZ9nxX7DWnOOStJXV3pS0uB83TXAkmqd7wvMBuIl9qu4Hfomi9aDM7IlEEn9tumQ==}
+  /@swc/core-linux-arm-gnueabihf@1.4.2:
+    resolution: {integrity: sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==}
     engines: {node: '>=10'}
     cpu: [arm]
     os: [linux]
@@ -4017,8 +3952,8 @@ packages:
     dev: true
     optional: true
 
-  /@swc/core-linux-arm64-gnu@1.3.107:
-    resolution: {integrity: sha512-HWgnn7JORYlOYnGsdunpSF8A+BCZKPLzLtEUA27/M/ZuANcMZabKL9Zurt7XQXq888uJFAt98Gy+59PU90aHKg==}
+  /@swc/core-linux-arm64-gnu@1.4.2:
+    resolution: {integrity: sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==}
     engines: {node: '>=10'}
     cpu: [arm64]
     os: [linux]
@@ -4026,8 +3961,8 @@ packages:
     dev: true
     optional: true
 
-  /@swc/core-linux-arm64-musl@1.3.107:
-    resolution: {integrity: sha512-vfPF74cWfAm8hyhS8yvYI94ucMHIo8xIYU+oFOW9uvDlGQRgnUf/6DEVbLyt/3yfX5723Ln57U8uiMALbX5Pyw==}
+  /@swc/core-linux-arm64-musl@1.4.2:
+    resolution: {integrity: sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==}
     engines: {node: '>=10'}
     cpu: [arm64]
     os: [linux]
@@ -4035,8 +3970,8 @@ packages:
     dev: true
     optional: true
 
-  /@swc/core-linux-x64-gnu@1.3.107:
-    resolution: {integrity: sha512-uBVNhIg0ip8rH9OnOsCARUFZ3Mq3tbPHxtmWk9uAa5u8jQwGWeBx5+nTHpDOVd3YxKb6+5xDEI/edeeLpha/9g==}
+  /@swc/core-linux-x64-gnu@1.4.2:
+    resolution: {integrity: sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==}
     engines: {node: '>=10'}
     cpu: [x64]
     os: [linux]
@@ -4044,8 +3979,8 @@ packages:
     dev: true
     optional: true
 
-  /@swc/core-linux-x64-musl@1.3.107:
-    resolution: {integrity: sha512-mvACkUvzSIB12q1H5JtabWATbk3AG+pQgXEN95AmEX2ZA5gbP9+B+mijsg7Sd/3tboHr7ZHLz/q3SHTvdFJrEw==}
+  /@swc/core-linux-x64-musl@1.4.2:
+    resolution: {integrity: sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==}
     engines: {node: '>=10'}
     cpu: [x64]
     os: [linux]
@@ -4053,8 +3988,8 @@ packages:
     dev: true
     optional: true
 
-  /@swc/core-win32-arm64-msvc@1.3.107:
-    resolution: {integrity: sha512-J3P14Ngy/1qtapzbguEH41kY109t6DFxfbK4Ntz9dOWNuVY3o9/RTB841ctnJk0ZHEG+BjfCJjsD2n8H5HcaOA==}
+  /@swc/core-win32-arm64-msvc@1.4.2:
+    resolution: {integrity: sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==}
     engines: {node: '>=10'}
     cpu: [arm64]
     os: [win32]
@@ -4062,8 +3997,8 @@ packages:
     dev: true
     optional: true
 
-  /@swc/core-win32-ia32-msvc@1.3.107:
-    resolution: {integrity: sha512-ZBUtgyjTHlz8TPJh7kfwwwFma+ktr6OccB1oXC8fMSopD0AxVnQasgun3l3099wIsAB9eEsJDQ/3lDkOLs1gBA==}
+  /@swc/core-win32-ia32-msvc@1.4.2:
+    resolution: {integrity: sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==}
     engines: {node: '>=10'}
     cpu: [ia32]
     os: [win32]
@@ -4071,8 +4006,8 @@ packages:
     dev: true
     optional: true
 
-  /@swc/core-win32-x64-msvc@1.3.107:
-    resolution: {integrity: sha512-Eyzo2XRqWOxqhE1gk9h7LWmUf4Bp4Xn2Ttb0ayAXFp6YSTxQIThXcT9kipXZqcpxcmDwoq8iWbbf2P8XL743EA==}
+  /@swc/core-win32-x64-msvc@1.4.2:
+    resolution: {integrity: sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==}
     engines: {node: '>=10'}
     cpu: [x64]
     os: [win32]
@@ -4080,8 +4015,8 @@ packages:
     dev: true
     optional: true
 
-  /@swc/core@1.3.107(@swc/helpers@0.5.3):
-    resolution: {integrity: sha512-zKhqDyFcTsyLIYK1iEmavljZnf4CCor5pF52UzLAz4B6Nu/4GLU+2LQVAf+oRHjusG39PTPjd2AlRT3f3QWfsQ==}
+  /@swc/core@1.4.2:
+    resolution: {integrity: sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==}
     engines: {node: '>=10'}
     requiresBuild: true
     peerDependencies:
@@ -4090,24 +4025,23 @@ packages:
       '@swc/helpers':
         optional: true
     dependencies:
-      '@swc/counter': 0.1.2
-      '@swc/helpers': 0.5.3
+      '@swc/counter': 0.1.3
       '@swc/types': 0.1.5
     optionalDependencies:
-      '@swc/core-darwin-arm64': 1.3.107
-      '@swc/core-darwin-x64': 1.3.107
-      '@swc/core-linux-arm-gnueabihf': 1.3.107
-      '@swc/core-linux-arm64-gnu': 1.3.107
-      '@swc/core-linux-arm64-musl': 1.3.107
-      '@swc/core-linux-x64-gnu': 1.3.107
-      '@swc/core-linux-x64-musl': 1.3.107
-      '@swc/core-win32-arm64-msvc': 1.3.107
-      '@swc/core-win32-ia32-msvc': 1.3.107
-      '@swc/core-win32-x64-msvc': 1.3.107
+      '@swc/core-darwin-arm64': 1.4.2
+      '@swc/core-darwin-x64': 1.4.2
+      '@swc/core-linux-arm-gnueabihf': 1.4.2
+      '@swc/core-linux-arm64-gnu': 1.4.2
+      '@swc/core-linux-arm64-musl': 1.4.2
+      '@swc/core-linux-x64-gnu': 1.4.2
+      '@swc/core-linux-x64-musl': 1.4.2
+      '@swc/core-win32-arm64-msvc': 1.4.2
+      '@swc/core-win32-ia32-msvc': 1.4.2
+      '@swc/core-win32-x64-msvc': 1.4.2
     dev: true
 
-  /@swc/counter@0.1.2:
-    resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==}
+  /@swc/counter@0.1.3:
+    resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
     dev: true
 
   /@swc/helpers@0.5.2:
@@ -4116,12 +4050,6 @@ packages:
       tslib: 2.6.2
     dev: true
 
-  /@swc/helpers@0.5.3:
-    resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==}
-    dependencies:
-      tslib: 2.6.2
-    dev: true
-
   /@swc/types@0.1.5:
     resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==}
     dev: true
@@ -4141,7 +4069,6 @@ packages:
 
   /@tokenizer/token@0.3.0:
     resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
-    dev: false
 
   /@trysound/sax@0.2.0:
     resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
@@ -4178,52 +4105,23 @@ packages:
       '@types/retry': 0.12.5
     dev: true
 
-  /@types/babel__core@7.20.5:
-    resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
-    dependencies:
-      '@babel/parser': 7.23.9
-      '@babel/types': 7.23.9
-      '@types/babel__generator': 7.6.8
-      '@types/babel__template': 7.4.4
-      '@types/babel__traverse': 7.20.5
-    dev: true
-
-  /@types/babel__generator@7.6.8:
-    resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
-    dependencies:
-      '@babel/types': 7.23.9
-    dev: true
-
-  /@types/babel__template@7.4.4:
-    resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
-    dependencies:
-      '@babel/parser': 7.23.9
-      '@babel/types': 7.23.9
-    dev: true
-
-  /@types/babel__traverse@7.20.5:
-    resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==}
-    dependencies:
-      '@babel/types': 7.23.9
-    dev: true
-
   /@types/body-parser@1.19.5:
     resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
     dependencies:
       '@types/connect': 3.4.38
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
 
   /@types/bonjour@3.5.13:
     resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
 
   /@types/cacheable-request@6.0.3:
     resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==}
     dependencies:
       '@types/http-cache-semantics': 4.0.4
       '@types/keyv': 3.1.4
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
       '@types/responselike': 1.0.3
     dev: true
 
@@ -4235,17 +4133,17 @@ packages:
     resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==}
     dependencies:
       '@types/express-serve-static-core': 4.17.42
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
 
   /@types/connect@3.4.38:
     resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
 
   /@types/cross-spawn@6.0.0:
     resolution: {integrity: sha512-evp2ZGsFw9YKprDbg8ySgC9NA15g3YgiI8ANkGmKKvvi0P2aDGYLPxQIC5qfeKNUOe3TjABVGuah6omPRpIYhg==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
     dev: true
 
   /@types/debug@4.1.12:
@@ -4253,13 +4151,6 @@ packages:
     dependencies:
       '@types/ms': 0.7.34
 
-  /@types/edit-json-file@1.7.3:
-    resolution: {integrity: sha512-88OYHTiVq7PNN50T+CIm+65Sl0aRweoXvTuTz4JhoQfy1FeK+wTCC9Peu1dljOqslRaqqSFlDee3wgkWMpxKHg==}
-    dependencies:
-      '@types/node': 18.19.14
-      '@types/set-value': 4.0.3
-    dev: true
-
   /@types/eslint-scope@3.7.7:
     resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
     dependencies:
@@ -4283,7 +4174,7 @@ packages:
   /@types/express-serve-static-core@4.17.42:
     resolution: {integrity: sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
       '@types/qs': 6.9.11
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
@@ -4296,12 +4187,6 @@ packages:
       '@types/qs': 6.9.11
       '@types/serve-static': 1.15.5
 
-  /@types/graceful-fs@4.1.9:
-    resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
-    dependencies:
-      '@types/node': 20.11.17
-    dev: true
-
   /@types/gtag.js@0.0.12:
     resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==}
     dev: true
@@ -4326,7 +4211,7 @@ packages:
   /@types/http-proxy@1.17.14:
     resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
 
   /@types/istanbul-lib-coverage@2.0.6:
     resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
@@ -4341,13 +4226,6 @@ packages:
     dependencies:
       '@types/istanbul-lib-report': 3.0.3
 
-  /@types/jest@29.5.12:
-    resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==}
-    dependencies:
-      expect: 29.7.0
-      pretty-format: 29.7.0
-    dev: true
-
   /@types/json-schema@7.0.13:
     resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==}
 
@@ -4360,7 +4238,7 @@ packages:
   /@types/keyv@3.1.4:
     resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
     dev: true
 
   /@types/lodash-es@4.17.12:
@@ -4400,14 +4278,14 @@ packages:
   /@types/node-fetch@2.6.9:
     resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
       form-data: 4.0.0
     dev: false
 
   /@types/node-forge@1.3.11:
     resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
 
   /@types/node@12.20.55:
     resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
@@ -4432,12 +4310,19 @@ packages:
     resolution: {integrity: sha512-w3yWCcwULefjP9DmDDsgUskrMoOy5Z8MiwKHr1FvqGPtx7CvJzQvxD7eKpxNtklQxLruxSXWddyeRtyud0RcXQ==}
     dependencies:
       undici-types: 5.26.5
+    dev: true
 
   /@types/node@20.11.17:
     resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==}
     dependencies:
       undici-types: 5.26.5
 
+  /@types/node@20.11.20:
+    resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==}
+    dependencies:
+      undici-types: 5.26.5
+    dev: true
+
   /@types/node@20.11.7:
     resolution: {integrity: sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==}
     dependencies:
@@ -4451,7 +4336,7 @@ packages:
   /@types/papaparse@5.3.14:
     resolution: {integrity: sha512-LxJ4iEFcpqc6METwp9f6BV6VVc43m6MfH0VqFosHvrUgfXiFe6ww7R3itkOQ+TCK6Y+Iv/+RnnvtRZnkc5Kc9g==}
     dependencies:
-      '@types/node': 18.19.14
+      '@types/node': 20.11.17
     dev: true
 
   /@types/parse-json@4.0.2:
@@ -4460,7 +4345,7 @@ packages:
   /@types/pg@8.11.0:
     resolution: {integrity: sha512-sDAlRiBNthGjNFfvt0k6mtotoVYVQ63pA8R4EMWka7crawSR60waVYR0HAgmPRs/e2YaeJTD/43OoZ3PFw80pw==}
     dependencies:
-      '@types/node': 18.19.14
+      '@types/node': 20.11.17
       pg-protocol: 1.6.0
       pg-types: 4.0.1
     dev: true
@@ -4488,7 +4373,7 @@ packages:
     resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==}
     dependencies:
       '@types/history': 4.7.11
-      '@types/react': 18.2.48
+      '@types/react': 18.2.55
       '@types/react-router': 5.1.20
     dev: true
 
@@ -4512,7 +4397,7 @@ packages:
     resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==}
     dependencies:
       '@types/history': 4.7.11
-      '@types/react': 18.2.48
+      '@types/react': 18.2.55
     dev: true
 
   /@types/react@18.2.48:
@@ -4529,14 +4414,10 @@ packages:
       '@types/scheduler': 0.16.8
       csstype: 3.1.3
 
-  /@types/resolve@1.20.2:
-    resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
-    dev: true
-
   /@types/responselike@1.0.3:
     resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
     dev: true
 
   /@types/retry@0.12.0:
@@ -4549,7 +4430,7 @@ packages:
   /@types/sax@1.2.7:
     resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
     dev: true
 
   /@types/scheduler@0.16.4:
@@ -4566,7 +4447,7 @@ packages:
     resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
     dependencies:
       '@types/mime': 1.3.5
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
 
   /@types/serve-index@1.9.4:
     resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==}
@@ -4578,25 +4459,17 @@ packages:
     dependencies:
       '@types/http-errors': 2.0.4
       '@types/mime': 3.0.4
-      '@types/node': 20.11.14
-
-  /@types/set-value@4.0.3:
-    resolution: {integrity: sha512-tSuUcLl6kMzI+l0gG7FZ04xbIcynxNIYgWFj91LPAvRcn7W3L1EveXNdVjqFDgAZPjY1qCOsm8Sb1C70SxAPHw==}
-    dev: true
+      '@types/node': 20.11.17
 
   /@types/sockjs@0.3.36:
     resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==}
     dependencies:
-      '@types/node': 20.11.14
-
-  /@types/stack-utils@2.0.3:
-    resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
-    dev: true
+      '@types/node': 20.11.17
 
   /@types/tar@6.1.5:
     resolution: {integrity: sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
       minipass: 4.2.8
     dev: true
 
@@ -4627,7 +4500,7 @@ packages:
   /@types/ws@8.5.10:
     resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
 
   /@types/yargs-parser@21.0.3:
     resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
@@ -4777,6 +4650,45 @@ packages:
     hasBin: true
     dev: true
 
+  /@vitest/expect@1.3.1:
+    resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==}
+    dependencies:
+      '@vitest/spy': 1.3.1
+      '@vitest/utils': 1.3.1
+      chai: 4.4.1
+    dev: true
+
+  /@vitest/runner@1.3.1:
+    resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==}
+    dependencies:
+      '@vitest/utils': 1.3.1
+      p-limit: 5.0.0
+      pathe: 1.1.2
+    dev: true
+
+  /@vitest/snapshot@1.3.1:
+    resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==}
+    dependencies:
+      magic-string: 0.30.7
+      pathe: 1.1.2
+      pretty-format: 29.7.0
+    dev: true
+
+  /@vitest/spy@1.3.1:
+    resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==}
+    dependencies:
+      tinyspy: 2.2.1
+    dev: true
+
+  /@vitest/utils@1.3.1:
+    resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==}
+    dependencies:
+      diff-sequences: 29.6.3
+      estree-walker: 3.0.3
+      loupe: 2.3.7
+      pretty-format: 29.7.0
+    dev: true
+
   /@webassemblyjs/ast@1.11.6:
     resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==}
     dependencies:
@@ -5023,13 +4935,6 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
-  /ansi-escapes@4.3.2:
-    resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
-    engines: {node: '>=8'}
-    dependencies:
-      type-fest: 0.21.3
-    dev: true
-
   /ansi-escapes@5.0.0:
     resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==}
     engines: {node: '>=12'}
@@ -5096,6 +5001,10 @@ packages:
     resolution: {integrity: sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==}
     dev: true
 
+  /arch@2.2.0:
+    resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
+    dev: true
+
   /arg@4.1.3:
     resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
     dev: true
@@ -5230,6 +5139,10 @@ packages:
       - utf-8-validate
     dev: false
 
+  /assertion-error@1.1.0:
+    resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+    dev: true
+
   /ast-module-types@2.7.1:
     resolution: {integrity: sha512-Rnnx/4Dus6fn7fTqdeLEAn5vUll5w7/vts0RN608yFa6si/rDOUonlIIiwugHBFWjylHjxm9owoSZn71KwG4gw==}
     dev: true
@@ -5329,24 +5242,6 @@ packages:
     resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==}
     dev: false
 
-  /babel-jest@29.7.0(@babel/core@7.23.9):
-    resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    peerDependencies:
-      '@babel/core': ^7.8.0
-    dependencies:
-      '@babel/core': 7.23.9
-      '@jest/transform': 29.7.0
-      '@types/babel__core': 7.20.5
-      babel-plugin-istanbul: 6.1.1
-      babel-preset-jest: 29.6.3(@babel/core@7.23.9)
-      chalk: 4.1.2
-      graceful-fs: 4.2.11
-      slash: 3.0.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
   /babel-loader@9.1.3(@babel/core@7.23.9)(webpack@5.90.0):
     resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==}
     engines: {node: '>= 14.15.0'}
@@ -5364,29 +5259,6 @@ packages:
     dependencies:
       object.assign: 4.1.5
 
-  /babel-plugin-istanbul@6.1.1:
-    resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
-    engines: {node: '>=8'}
-    dependencies:
-      '@babel/helper-plugin-utils': 7.22.5
-      '@istanbuljs/load-nyc-config': 1.1.0
-      '@istanbuljs/schema': 0.1.3
-      istanbul-lib-instrument: 5.2.1
-      test-exclude: 6.0.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /babel-plugin-jest-hoist@29.6.3:
-    resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@babel/template': 7.23.9
-      '@babel/types': 7.23.9
-      '@types/babel__core': 7.20.5
-      '@types/babel__traverse': 7.20.5
-    dev: true
-
   /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.9):
     resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==}
     peerDependencies:
@@ -5420,37 +5292,6 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
-  /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9):
-    resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.23.9
-      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9)
-      '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.9)
-      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9)
-      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9)
-      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9)
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9)
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9)
-      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9)
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9)
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9)
-      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9)
-      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9)
-    dev: true
-
-  /babel-preset-jest@29.6.3(@babel/core@7.23.9):
-    resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.23.9
-      babel-plugin-jest-hoist: 29.6.3
-      babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9)
-    dev: true
-
   /bail@2.0.2:
     resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
 
@@ -5477,6 +5318,31 @@ packages:
   /big.js@5.2.2:
     resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
 
+  /bin-check@4.1.0:
+    resolution: {integrity: sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==}
+    engines: {node: '>=4'}
+    dependencies:
+      execa: 0.7.0
+      executable: 4.1.1
+    dev: true
+
+  /bin-version-check@5.1.0:
+    resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==}
+    engines: {node: '>=12'}
+    dependencies:
+      bin-version: 6.0.0
+      semver: 7.6.0
+      semver-truncate: 3.0.0
+    dev: true
+
+  /bin-version@6.0.0:
+    resolution: {integrity: sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==}
+    engines: {node: '>=12'}
+    dependencies:
+      execa: 5.1.1
+      find-versions: 5.1.0
+    dev: true
+
   /binary-extensions@2.2.0:
     resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
     engines: {node: '>=8'}
@@ -5579,19 +5445,6 @@ packages:
       node-releases: 2.0.14
       update-browserslist-db: 1.0.13(browserslist@4.22.3)
 
-  /bs-logger@0.2.6:
-    resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
-    engines: {node: '>= 6'}
-    dependencies:
-      fast-json-stable-stringify: 2.1.0
-    dev: true
-
-  /bser@2.1.1:
-    resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
-    dependencies:
-      node-int64: 0.4.0
-    dev: true
-
   /bson@6.2.0:
     resolution: {integrity: sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==}
     engines: {node: '>=16.20.1'}
@@ -5620,48 +5473,10 @@ packages:
     dev: false
     optional: true
 
-  /builtin-modules@3.3.0:
-    resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
-    engines: {node: '>=6'}
-    dev: true
-
   /builtins@1.0.3:
     resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==}
     dev: true
 
-  /bunchee@4.4.6(typescript@5.3.3):
-    resolution: {integrity: sha512-sRYDasLVGtxv/KmnRrlFpCCt23l3tZHi2ZhBlzJLmuT7c5ULorf2iJfFJzoH0g5hCgtgwkvPuO49EGFCVCVlWQ==}
-    engines: {node: '>= 18.0.0'}
-    hasBin: true
-    peerDependencies:
-      typescript: ^4.1 || ^5.0
-    peerDependenciesMeta:
-      '@swc/helpers':
-        optional: true
-      typescript:
-        optional: true
-    dependencies:
-      '@rollup/plugin-commonjs': 25.0.7(rollup@4.9.5)
-      '@rollup/plugin-json': 6.1.0(rollup@4.9.5)
-      '@rollup/plugin-node-resolve': 15.2.3(rollup@4.9.5)
-      '@rollup/plugin-replace': 5.0.5(rollup@4.9.5)
-      '@rollup/plugin-wasm': 6.2.2(rollup@4.9.5)
-      '@rollup/pluginutils': 5.1.0(rollup@4.9.5)
-      '@swc/core': 1.3.107(@swc/helpers@0.5.3)
-      '@swc/helpers': 0.5.3
-      arg: 5.0.2
-      clean-css: 5.3.3
-      magic-string: 0.30.7
-      pretty-bytes: 5.6.0
-      rimraf: 5.0.5
-      rollup: 4.9.5
-      rollup-plugin-dts: 6.1.0(rollup@4.9.5)(typescript@5.3.3)
-      rollup-plugin-swc3: 0.11.0(@swc/core@1.3.107)(rollup@4.9.5)
-      rollup-preserve-directives: 1.1.1(rollup@4.9.5)
-      tslib: 2.6.2
-      typescript: 5.3.3
-    dev: true
-
   /busboy@1.6.0:
     resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
     engines: {node: '>=10.16.0'}
@@ -5677,6 +5492,11 @@ packages:
     resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
     engines: {node: '>= 0.8'}
 
+  /cac@6.7.14:
+    resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+    engines: {node: '>=8'}
+    dev: true
+
   /cacheable-lookup@2.0.1:
     resolution: {integrity: sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==}
     engines: {node: '>=10'}
@@ -5685,6 +5505,11 @@ packages:
       keyv: 4.5.4
     dev: true
 
+  /cacheable-lookup@5.0.4:
+    resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
+    engines: {node: '>=10.6.0'}
+    dev: true
+
   /cacheable-lookup@7.0.0:
     resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
     engines: {node: '>=14.16'}
@@ -5767,6 +5592,19 @@ packages:
   /ccount@2.0.1:
     resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
 
+  /chai@4.4.1:
+    resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==}
+    engines: {node: '>=4'}
+    dependencies:
+      assertion-error: 1.1.0
+      check-error: 1.0.3
+      deep-eql: 4.1.3
+      get-func-name: 2.0.2
+      loupe: 2.3.7
+      pathval: 1.1.1
+      type-detect: 4.0.8
+    dev: true
+
   /chalk@2.4.2:
     resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
     engines: {node: '>=4'}
@@ -5810,6 +5648,12 @@ packages:
     resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
     dev: false
 
+  /check-error@1.0.3:
+    resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
+    dependencies:
+      get-func-name: 2.0.2
+    dev: true
+
   /cheerio-select@2.1.0:
     resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
     dependencies:
@@ -5909,10 +5753,6 @@ packages:
     resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
     engines: {node: '>=8'}
 
-  /cjs-module-lexer@1.2.3:
-    resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==}
-    dev: true
-
   /clean-css@5.3.3:
     resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
     engines: {node: '>= 10.0'}
@@ -6005,11 +5845,6 @@ packages:
     resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==}
     engines: {node: '>=6'}
 
-  /co@4.6.0:
-    resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
-    engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
-    dev: true
-
   /codsen-utils@1.6.4:
     resolution: {integrity: sha512-PDyvQ5f2PValmqZZIJATimcokDt4JjIev8cKbZgEOoZm+U1IJDYuLeTcxZPQdep99R/X0RIlQ6ReQgPOVnPbNw==}
     engines: {node: '>=14.18.0'}
@@ -6032,10 +5867,6 @@ packages:
   /collapse-white-space@2.1.0:
     resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
 
-  /collect-v8-coverage@1.0.2:
-    resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
-    dev: true
-
   /color-convert@1.9.3:
     resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
     dependencies:
@@ -6112,10 +5943,10 @@ packages:
 
   /commander@2.20.0:
     resolution: {integrity: sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==}
-    dev: true
 
   /commander@2.20.3:
     resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+    dev: true
 
   /commander@5.1.0:
     resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
@@ -6164,6 +5995,22 @@ packages:
   /concat-map@0.0.1:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
 
+  /concurrently@8.2.2:
+    resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==}
+    engines: {node: ^14.13.0 || >=16.0.0}
+    hasBin: true
+    dependencies:
+      chalk: 4.1.2
+      date-fns: 2.30.0
+      lodash: 4.17.21
+      rxjs: 7.8.1
+      shell-quote: 1.8.1
+      spawn-command: 0.0.2
+      supports-color: 8.1.1
+      tree-kill: 1.2.2
+      yargs: 17.7.2
+    dev: true
+
   /conf@10.2.0:
     resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==}
     engines: {node: '>=12'}
@@ -6297,25 +6144,6 @@ packages:
       path-type: 4.0.0
       typescript: 5.3.3
 
-  /create-jest@29.7.0:
-    resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    hasBin: true
-    dependencies:
-      '@jest/types': 29.6.3
-      chalk: 4.1.2
-      exit: 0.1.2
-      graceful-fs: 4.2.11
-      jest-config: 29.7.0(@types/node@20.11.17)
-      jest-util: 29.7.0
-      prompts: 2.4.2
-    transitivePeerDependencies:
-      - '@types/node'
-      - babel-plugin-macros
-      - supports-color
-      - ts-node
-    dev: true
-
   /create-require@1.1.1:
     resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
     dev: true
@@ -6555,6 +6383,13 @@ packages:
     resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
     dev: false
 
+  /date-fns@2.30.0:
+    resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
+    engines: {node: '>=0.11'}
+    dependencies:
+      '@babel/runtime': 7.23.9
+    dev: true
+
   /debounce-fn@4.0.0:
     resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==}
     engines: {node: '>=10'}
@@ -6628,13 +6463,11 @@ packages:
     dependencies:
       mimic-response: 3.1.0
 
-  /dedent@1.5.1:
-    resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==}
-    peerDependencies:
-      babel-plugin-macros: ^3.1.0
-    peerDependenciesMeta:
-      babel-plugin-macros:
-        optional: true
+  /deep-eql@4.1.3:
+    resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
+    engines: {node: '>=6'}
+    dependencies:
+      type-detect: 4.0.8
     dev: true
 
   /deep-extend@0.6.0:
@@ -6750,11 +6583,6 @@ packages:
     engines: {node: '>=8'}
     dev: false
 
-  /detect-newline@3.1.0:
-    resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
-    engines: {node: '>=8'}
-    dev: true
-
   /detect-node@2.1.0:
     resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
 
@@ -7081,27 +6909,12 @@ packages:
   /eastasianwidth@0.2.0:
     resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
 
-  /edit-json-file@1.8.0:
-    resolution: {integrity: sha512-IBOpbe2aQufNl5oZ4jsr2AmNVUy5bO7jS5hk0cCyWhOLdH59Xv41B3XQObE/JB89Ae5qDY9hVsq13/hgGhFBZg==}
-    dependencies:
-      find-value: 1.0.12
-      iterate-object: 1.3.4
-      r-json: 1.3.0
-      set-value: 4.1.0
-      w-json: 1.3.10
-    dev: true
-
   /ee-first@1.1.1:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
 
   /electron-to-chromium@1.4.648:
     resolution: {integrity: sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg==}
 
-  /emittery@0.13.1:
-    resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
-    engines: {node: '>=12'}
-    dev: true
-
   /emoji-regex@10.3.0:
     resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==}
     dev: true
@@ -7315,6 +7128,37 @@ packages:
       is-date-object: 1.0.5
       is-symbol: 1.0.4
 
+  /esbuild@0.19.12:
+    resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.19.12
+      '@esbuild/android-arm': 0.19.12
+      '@esbuild/android-arm64': 0.19.12
+      '@esbuild/android-x64': 0.19.12
+      '@esbuild/darwin-arm64': 0.19.12
+      '@esbuild/darwin-x64': 0.19.12
+      '@esbuild/freebsd-arm64': 0.19.12
+      '@esbuild/freebsd-x64': 0.19.12
+      '@esbuild/linux-arm': 0.19.12
+      '@esbuild/linux-arm64': 0.19.12
+      '@esbuild/linux-ia32': 0.19.12
+      '@esbuild/linux-loong64': 0.19.12
+      '@esbuild/linux-mips64el': 0.19.12
+      '@esbuild/linux-ppc64': 0.19.12
+      '@esbuild/linux-riscv64': 0.19.12
+      '@esbuild/linux-s390x': 0.19.12
+      '@esbuild/linux-x64': 0.19.12
+      '@esbuild/netbsd-x64': 0.19.12
+      '@esbuild/openbsd-x64': 0.19.12
+      '@esbuild/sunos-x64': 0.19.12
+      '@esbuild/win32-arm64': 0.19.12
+      '@esbuild/win32-ia32': 0.19.12
+      '@esbuild/win32-x64': 0.19.12
+    dev: true
+
   /escalade@3.1.1:
     resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
     engines: {node: '>=6'}
@@ -7335,11 +7179,6 @@ packages:
     resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
     engines: {node: '>=0.8.0'}
 
-  /escape-string-regexp@2.0.0:
-    resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
-    engines: {node: '>=8'}
-    dev: true
-
   /escape-string-regexp@4.0.0:
     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
     engines: {node: '>=10'}
@@ -7730,10 +7569,6 @@ packages:
       '@types/estree-jsx': 1.0.3
       '@types/unist': 3.0.2
 
-  /estree-walker@2.0.2:
-    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
-    dev: true
-
   /estree-walker@3.0.3:
     resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
     dependencies:
@@ -7755,7 +7590,7 @@ packages:
     resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==}
     engines: {node: '>= 0.8'}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
       require-like: 0.1.2
 
   /event-target-shim@5.0.1:
@@ -7774,6 +7609,19 @@ packages:
     resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
     engines: {node: '>=0.8.x'}
 
+  /execa@0.7.0:
+    resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==}
+    engines: {node: '>=4'}
+    dependencies:
+      cross-spawn: 5.1.0
+      get-stream: 3.0.0
+      is-stream: 1.1.0
+      npm-run-path: 2.0.2
+      p-finally: 1.0.0
+      signal-exit: 3.0.7
+      strip-eof: 1.0.0
+    dev: true
+
   /execa@5.1.1:
     resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
     engines: {node: '>=10'}
@@ -7803,9 +7651,11 @@ packages:
       strip-final-newline: 3.0.0
     dev: true
 
-  /exit@0.1.2:
-    resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
-    engines: {node: '>= 0.8.0'}
+  /executable@4.1.1:
+    resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
+    engines: {node: '>=4'}
+    dependencies:
+      pify: 2.3.0
     dev: true
 
   /expand-template@2.0.3:
@@ -7813,17 +7663,6 @@ packages:
     engines: {node: '>=6'}
     dev: false
 
-  /expect@29.7.0:
-    resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/expect-utils': 29.7.0
-      jest-get-type: 29.6.3
-      jest-matcher-utils: 29.7.0
-      jest-message-util: 29.7.0
-      jest-util: 29.7.0
-    dev: true
-
   /express@4.18.2:
     resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
     engines: {node: '>= 0.10.0'}
@@ -7862,6 +7701,21 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
+  /ext-list@2.2.2:
+    resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      mime-db: 1.52.0
+    dev: true
+
+  /ext-name@5.0.0:
+    resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==}
+    engines: {node: '>=4'}
+    dependencies:
+      ext-list: 2.2.2
+      sort-keys-length: 1.0.1
+    dev: true
+
   /extend-shallow@2.0.1:
     resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
     engines: {node: '>=0.10.0'}
@@ -7900,7 +7754,6 @@ packages:
       glob-parent: 5.1.2
       merge2: 1.4.1
       micromatch: 4.0.5
-    dev: true
 
   /fast-glob@3.3.2:
     resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
@@ -7939,12 +7792,6 @@ packages:
     dependencies:
       websocket-driver: 0.7.4
 
-  /fb-watchman@2.0.2:
-    resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
-    dependencies:
-      bser: 2.1.1
-    dev: true
-
   /fecha@4.2.3:
     resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
     dev: false
@@ -7972,6 +7819,15 @@ packages:
       schema-utils: 3.3.0
       webpack: 5.90.0
 
+  /file-type@17.1.6:
+    resolution: {integrity: sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dependencies:
+      readable-web-to-node-stream: 3.0.2
+      strtok3: 7.0.0
+      token-types: 5.0.1
+    dev: true
+
   /file-type@18.7.0:
     resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==}
     engines: {node: '>=14.16'}
@@ -7981,6 +7837,20 @@ packages:
       token-types: 5.0.1
     dev: false
 
+  /filename-reserved-regex@3.0.0:
+    resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dev: true
+
+  /filenamify@5.1.1:
+    resolution: {integrity: sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==}
+    engines: {node: '>=12.20'}
+    dependencies:
+      filename-reserved-regex: 3.0.0
+      strip-outer: 2.0.0
+      trim-repeated: 2.0.0
+    dev: true
+
   /filesize@8.0.7:
     resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==}
     engines: {node: '>= 0.4.0'}
@@ -8062,8 +7932,11 @@ packages:
       locate-path: 7.2.0
       path-exists: 5.0.0
 
-  /find-value@1.0.12:
-    resolution: {integrity: sha512-OCpo8LTk8eZ2sdDCwbU2Lc3ivYsdM6yod6jP2jHcNEFcjPhkgH0+POzTIol7xx1LZgtbI5rkO5jqxsG5MWtPjQ==}
+  /find-versions@5.1.0:
+    resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==}
+    engines: {node: '>=12'}
+    dependencies:
+      semver-regex: 4.0.5
     dev: true
 
   /find-yarn-workspace-root2@1.2.16:
@@ -8149,7 +8022,7 @@ packages:
       memfs: 3.5.3
       minimatch: 3.1.2
       schema-utils: 2.7.0
-      semver: 7.5.4
+      semver: 7.6.0
       tapable: 1.1.3
       typescript: 5.3.3
       webpack: 5.90.0
@@ -8333,6 +8206,10 @@ packages:
     engines: {node: '>=18'}
     dev: true
 
+  /get-func-name@2.0.2:
+    resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
+    dev: true
+
   /get-intrinsic@1.2.2:
     resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==}
     dependencies:
@@ -8344,9 +8221,9 @@ packages:
   /get-own-enumerable-property-symbols@3.0.2:
     resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
 
-  /get-package-type@0.1.0:
-    resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
-    engines: {node: '>=8.0.0'}
+  /get-stream@3.0.0:
+    resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==}
+    engines: {node: '>=4'}
     dev: true
 
   /get-stream@5.2.0:
@@ -8376,6 +8253,7 @@ packages:
     resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==}
     dependencies:
       resolve-pkg-maps: 1.0.0
+    dev: false
 
   /github-from-package@0.0.0:
     resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
@@ -8432,17 +8310,6 @@ packages:
       once: 1.4.0
       path-is-absolute: 1.0.1
 
-  /glob@8.1.0:
-    resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
-    engines: {node: '>=12'}
-    dependencies:
-      fs.realpath: 1.0.0
-      inflight: 1.0.6
-      inherits: 2.0.4
-      minimatch: 5.1.6
-      once: 1.4.0
-    dev: true
-
   /global-dirs@3.0.1:
     resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
     engines: {node: '>=10'}
@@ -8495,7 +8362,7 @@ packages:
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
     dependencies:
       dir-glob: 3.0.1
-      fast-glob: 3.3.2
+      fast-glob: 3.3.1
       ignore: 5.3.0
       merge2: 1.4.1
       slash: 4.0.0
@@ -8536,6 +8403,23 @@ packages:
       type-fest: 0.10.0
     dev: true
 
+  /got@11.8.6:
+    resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
+    engines: {node: '>=10.19.0'}
+    dependencies:
+      '@sindresorhus/is': 4.6.0
+      '@szmarczak/http-timer': 4.0.6
+      '@types/cacheable-request': 6.0.3
+      '@types/responselike': 1.0.3
+      cacheable-lookup: 5.0.4
+      cacheable-request: 7.0.4
+      decompress-response: 6.0.0
+      http2-wrapper: 1.0.3
+      lowercase-keys: 2.0.0
+      p-cancelable: 2.1.1
+      responselike: 2.0.1
+    dev: true
+
   /got@12.6.1:
     resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==}
     engines: {node: '>=14.16'}
@@ -8916,6 +8800,14 @@ packages:
     transitivePeerDependencies:
       - debug
 
+  /http2-wrapper@1.0.3:
+    resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
+    engines: {node: '>=10.19.0'}
+    dependencies:
+      quick-lru: 5.1.1
+      resolve-alpn: 1.2.1
+    dev: true
+
   /http2-wrapper@2.2.1:
     resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==}
     engines: {node: '>=10.19.0'}
@@ -9005,15 +8897,6 @@ packages:
     resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
     engines: {node: '>=8'}
 
-  /import-local@3.1.0:
-    resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
-    engines: {node: '>=8'}
-    hasBin: true
-    dependencies:
-      pkg-dir: 4.2.0
-      resolve-cwd: 3.0.0
-    dev: true
-
   /imurmurhash@0.1.4:
     resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
     engines: {node: '>=0.8.19'}
@@ -9142,13 +9025,6 @@ packages:
     resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
     dev: false
 
-  /is-builtin-module@3.2.1:
-    resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
-    engines: {node: '>=6'}
-    dependencies:
-      builtin-modules: 3.3.0
-    dev: true
-
   /is-callable@1.2.7:
     resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
     engines: {node: '>= 0.4'}
@@ -9214,11 +9090,6 @@ packages:
       get-east-asian-width: 1.2.0
     dev: true
 
-  /is-generator-fn@2.1.0:
-    resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
-    engines: {node: '>=6'}
-    dev: true
-
   /is-generator-function@1.0.10:
     resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
     engines: {node: '>= 0.4'}
@@ -9251,10 +9122,6 @@ packages:
     resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
     dev: false
 
-  /is-module@1.0.0:
-    resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
-    dev: true
-
   /is-negative-zero@2.0.2:
     resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
     engines: {node: '>= 0.4'}
@@ -9312,17 +9179,6 @@ packages:
     resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
     engines: {node: '>=0.10.0'}
 
-  /is-primitive@3.0.1:
-    resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-reference@1.2.1:
-    resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
-    dependencies:
-      '@types/estree': 1.0.5
-    dev: true
-
   /is-reference@3.0.2:
     resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
     dependencies:
@@ -9356,6 +9212,11 @@ packages:
     dependencies:
       call-bind: 1.0.5
 
+  /is-stream@1.1.0:
+    resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
   /is-stream@2.0.1:
     resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
     engines: {node: '>=8'}
@@ -9367,523 +9228,119 @@ packages:
 
   /is-string@1.0.7:
     resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-tostringtag: 1.0.0
-
-  /is-subdir@1.2.0:
-    resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==}
-    engines: {node: '>=4'}
-    dependencies:
-      better-path-resolve: 1.0.0
-    dev: true
-
-  /is-symbol@1.0.4:
-    resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-symbols: 1.0.3
-
-  /is-typed-array@1.1.12:
-    resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      which-typed-array: 1.1.13
-
-  /is-typedarray@1.0.0:
-    resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
-
-  /is-unicode-supported@0.1.0:
-    resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /is-url-superb@4.0.0:
-    resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /is-url@1.2.4:
-    resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
-    dev: true
-
-  /is-weakmap@2.0.1:
-    resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
-    dev: false
-
-  /is-weakref@1.0.2:
-    resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
-    dependencies:
-      call-bind: 1.0.5
-
-  /is-weakset@2.0.2:
-    resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==}
-    dependencies:
-      call-bind: 1.0.5
-      get-intrinsic: 1.2.2
-    dev: false
-
-  /is-windows@1.0.2:
-    resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-wsl@2.2.0:
-    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
-    engines: {node: '>=8'}
-    dependencies:
-      is-docker: 2.2.1
-
-  /is-yarn-global@0.4.1:
-    resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==}
-    engines: {node: '>=12'}
-
-  /isarray@0.0.1:
-    resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
-
-  /isarray@1.0.0:
-    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
-
-  /isarray@2.0.5:
-    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
-
-  /isexe@2.0.0:
-    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
-  /isobject@3.0.1:
-    resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
-    engines: {node: '>=0.10.0'}
-
-  /isomorphic-fetch@3.0.0:
-    resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==}
-    dependencies:
-      node-fetch: 2.7.0(encoding@0.1.13)
-      whatwg-fetch: 3.6.20
-    transitivePeerDependencies:
-      - encoding
-    dev: false
-
-  /istanbul-lib-coverage@3.2.2:
-    resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /istanbul-lib-instrument@5.2.1:
-    resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
-    engines: {node: '>=8'}
-    dependencies:
-      '@babel/core': 7.23.9
-      '@babel/parser': 7.23.9
-      '@istanbuljs/schema': 0.1.3
-      istanbul-lib-coverage: 3.2.2
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /istanbul-lib-instrument@6.0.1:
-    resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==}
-    engines: {node: '>=10'}
-    dependencies:
-      '@babel/core': 7.23.9
-      '@babel/parser': 7.23.9
-      '@istanbuljs/schema': 0.1.3
-      istanbul-lib-coverage: 3.2.2
-      semver: 7.6.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /istanbul-lib-report@3.0.1:
-    resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
-    engines: {node: '>=10'}
-    dependencies:
-      istanbul-lib-coverage: 3.2.2
-      make-dir: 4.0.0
-      supports-color: 7.2.0
-    dev: true
-
-  /istanbul-lib-source-maps@4.0.1:
-    resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
-    engines: {node: '>=10'}
-    dependencies:
-      debug: 4.3.4
-      istanbul-lib-coverage: 3.2.2
-      source-map: 0.6.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /istanbul-reports@3.1.6:
-    resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==}
-    engines: {node: '>=8'}
-    dependencies:
-      html-escaper: 2.0.2
-      istanbul-lib-report: 3.0.1
-    dev: true
-
-  /iterate-object@1.3.4:
-    resolution: {integrity: sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==}
-    dev: true
-
-  /iterator.prototype@1.1.2:
-    resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
-    dependencies:
-      define-properties: 1.2.1
-      get-intrinsic: 1.2.2
-      has-symbols: 1.0.3
-      reflect.getprototypeof: 1.0.4
-      set-function-name: 2.0.1
-    dev: false
-
-  /jackspeak@2.3.6:
-    resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
-    engines: {node: '>=14'}
-    dependencies:
-      '@isaacs/cliui': 8.0.2
-    optionalDependencies:
-      '@pkgjs/parseargs': 0.11.0
-    dev: true
-
-  /jest-changed-files@29.7.0:
-    resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      execa: 5.1.1
-      jest-util: 29.7.0
-      p-limit: 3.1.0
-    dev: true
-
-  /jest-circus@29.7.0:
-    resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/environment': 29.7.0
-      '@jest/expect': 29.7.0
-      '@jest/test-result': 29.7.0
-      '@jest/types': 29.6.3
-      '@types/node': 20.11.17
-      chalk: 4.1.2
-      co: 4.6.0
-      dedent: 1.5.1
-      is-generator-fn: 2.1.0
-      jest-each: 29.7.0
-      jest-matcher-utils: 29.7.0
-      jest-message-util: 29.7.0
-      jest-runtime: 29.7.0
-      jest-snapshot: 29.7.0
-      jest-util: 29.7.0
-      p-limit: 3.1.0
-      pretty-format: 29.7.0
-      pure-rand: 6.0.4
-      slash: 3.0.0
-      stack-utils: 2.0.6
-    transitivePeerDependencies:
-      - babel-plugin-macros
-      - supports-color
-    dev: true
-
-  /jest-cli@29.7.0:
-    resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    hasBin: true
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
-    dependencies:
-      '@jest/core': 29.7.0
-      '@jest/test-result': 29.7.0
-      '@jest/types': 29.6.3
-      chalk: 4.1.2
-      create-jest: 29.7.0
-      exit: 0.1.2
-      import-local: 3.1.0
-      jest-config: 29.7.0(@types/node@20.11.17)
-      jest-util: 29.7.0
-      jest-validate: 29.7.0
-      yargs: 17.7.2
-    transitivePeerDependencies:
-      - '@types/node'
-      - babel-plugin-macros
-      - supports-color
-      - ts-node
-    dev: true
-
-  /jest-config@29.7.0(@types/node@20.11.17):
-    resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    peerDependencies:
-      '@types/node': '*'
-      ts-node: '>=9.0.0'
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      ts-node:
-        optional: true
-    dependencies:
-      '@babel/core': 7.23.9
-      '@jest/test-sequencer': 29.7.0
-      '@jest/types': 29.6.3
-      '@types/node': 20.11.17
-      babel-jest: 29.7.0(@babel/core@7.23.9)
-      chalk: 4.1.2
-      ci-info: 3.9.0
-      deepmerge: 4.3.1
-      glob: 7.2.3
-      graceful-fs: 4.2.11
-      jest-circus: 29.7.0
-      jest-environment-node: 29.7.0
-      jest-get-type: 29.6.3
-      jest-regex-util: 29.6.3
-      jest-resolve: 29.7.0
-      jest-runner: 29.7.0
-      jest-util: 29.7.0
-      jest-validate: 29.7.0
-      micromatch: 4.0.5
-      parse-json: 5.2.0
-      pretty-format: 29.7.0
-      slash: 3.0.0
-      strip-json-comments: 3.1.1
-    transitivePeerDependencies:
-      - babel-plugin-macros
-      - supports-color
-    dev: true
-
-  /jest-diff@29.7.0:
-    resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      chalk: 4.1.2
-      diff-sequences: 29.6.3
-      jest-get-type: 29.6.3
-      pretty-format: 29.7.0
-    dev: true
+    engines: {node: '>= 0.4'}
+    dependencies:
+      has-tostringtag: 1.0.0
 
-  /jest-docblock@29.7.0:
-    resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  /is-subdir@1.2.0:
+    resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==}
+    engines: {node: '>=4'}
     dependencies:
-      detect-newline: 3.1.0
+      better-path-resolve: 1.0.0
     dev: true
 
-  /jest-each@29.7.0:
-    resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  /is-symbol@1.0.4:
+    resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+    engines: {node: '>= 0.4'}
     dependencies:
-      '@jest/types': 29.6.3
-      chalk: 4.1.2
-      jest-get-type: 29.6.3
-      jest-util: 29.7.0
-      pretty-format: 29.7.0
-    dev: true
+      has-symbols: 1.0.3
 
-  /jest-environment-node@29.7.0:
-    resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  /is-typed-array@1.1.12:
+    resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
+    engines: {node: '>= 0.4'}
     dependencies:
-      '@jest/environment': 29.7.0
-      '@jest/fake-timers': 29.7.0
-      '@jest/types': 29.6.3
-      '@types/node': 20.11.17
-      jest-mock: 29.7.0
-      jest-util: 29.7.0
-    dev: true
+      which-typed-array: 1.1.13
 
-  /jest-get-type@29.6.3:
-    resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dev: true
+  /is-typedarray@1.0.0:
+    resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
 
-  /jest-haste-map@29.7.0:
-    resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/types': 29.6.3
-      '@types/graceful-fs': 4.1.9
-      '@types/node': 20.11.17
-      anymatch: 3.1.3
-      fb-watchman: 2.0.2
-      graceful-fs: 4.2.11
-      jest-regex-util: 29.6.3
-      jest-util: 29.7.0
-      jest-worker: 29.7.0
-      micromatch: 4.0.5
-      walker: 1.0.8
-    optionalDependencies:
-      fsevents: 2.3.3
+  /is-unicode-supported@0.1.0:
+    resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+    engines: {node: '>=10'}
     dev: true
 
-  /jest-leak-detector@29.7.0:
-    resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      jest-get-type: 29.6.3
-      pretty-format: 29.7.0
+  /is-url-superb@4.0.0:
+    resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==}
+    engines: {node: '>=10'}
     dev: true
 
-  /jest-matcher-utils@29.7.0:
-    resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      chalk: 4.1.2
-      jest-diff: 29.7.0
-      jest-get-type: 29.6.3
-      pretty-format: 29.7.0
+  /is-url@1.2.4:
+    resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
     dev: true
 
-  /jest-message-util@29.7.0:
-    resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@babel/code-frame': 7.23.5
-      '@jest/types': 29.6.3
-      '@types/stack-utils': 2.0.3
-      chalk: 4.1.2
-      graceful-fs: 4.2.11
-      micromatch: 4.0.5
-      pretty-format: 29.7.0
-      slash: 3.0.0
-      stack-utils: 2.0.6
-    dev: true
+  /is-weakmap@2.0.1:
+    resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
+    dev: false
 
-  /jest-mock@29.7.0:
-    resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  /is-weakref@1.0.2:
+    resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
     dependencies:
-      '@jest/types': 29.6.3
-      '@types/node': 20.11.17
-      jest-util: 29.7.0
-    dev: true
+      call-bind: 1.0.5
 
-  /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
-    resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
-    engines: {node: '>=6'}
-    peerDependencies:
-      jest-resolve: '*'
-    peerDependenciesMeta:
-      jest-resolve:
-        optional: true
+  /is-weakset@2.0.2:
+    resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==}
     dependencies:
-      jest-resolve: 29.7.0
-    dev: true
+      call-bind: 1.0.5
+      get-intrinsic: 1.2.2
+    dev: false
 
-  /jest-regex-util@29.6.3:
-    resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  /is-windows@1.0.2:
+    resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+    engines: {node: '>=0.10.0'}
     dev: true
 
-  /jest-resolve-dependencies@29.7.0:
-    resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  /is-wsl@2.2.0:
+    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+    engines: {node: '>=8'}
     dependencies:
-      jest-regex-util: 29.6.3
-      jest-snapshot: 29.7.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      is-docker: 2.2.1
 
-  /jest-resolve@29.7.0:
-    resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      chalk: 4.1.2
-      graceful-fs: 4.2.11
-      jest-haste-map: 29.7.0
-      jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0)
-      jest-util: 29.7.0
-      jest-validate: 29.7.0
-      resolve: 1.22.8
-      resolve.exports: 2.0.2
-      slash: 3.0.0
-    dev: true
+  /is-yarn-global@0.4.1:
+    resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==}
+    engines: {node: '>=12'}
 
-  /jest-runner@29.7.0:
-    resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  /isarray@0.0.1:
+    resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
+
+  /isarray@1.0.0:
+    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+  /isarray@2.0.5:
+    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+  /isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  /isobject@3.0.1:
+    resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+    engines: {node: '>=0.10.0'}
+
+  /isomorphic-fetch@3.0.0:
+    resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==}
     dependencies:
-      '@jest/console': 29.7.0
-      '@jest/environment': 29.7.0
-      '@jest/test-result': 29.7.0
-      '@jest/transform': 29.7.0
-      '@jest/types': 29.6.3
-      '@types/node': 20.11.17
-      chalk: 4.1.2
-      emittery: 0.13.1
-      graceful-fs: 4.2.11
-      jest-docblock: 29.7.0
-      jest-environment-node: 29.7.0
-      jest-haste-map: 29.7.0
-      jest-leak-detector: 29.7.0
-      jest-message-util: 29.7.0
-      jest-resolve: 29.7.0
-      jest-runtime: 29.7.0
-      jest-util: 29.7.0
-      jest-watcher: 29.7.0
-      jest-worker: 29.7.0
-      p-limit: 3.1.0
-      source-map-support: 0.5.13
+      node-fetch: 2.7.0(encoding@0.1.13)
+      whatwg-fetch: 3.6.20
     transitivePeerDependencies:
-      - supports-color
-    dev: true
+      - encoding
+    dev: false
 
-  /jest-runtime@29.7.0:
-    resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  /iterator.prototype@1.1.2:
+    resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
     dependencies:
-      '@jest/environment': 29.7.0
-      '@jest/fake-timers': 29.7.0
-      '@jest/globals': 29.7.0
-      '@jest/source-map': 29.6.3
-      '@jest/test-result': 29.7.0
-      '@jest/transform': 29.7.0
-      '@jest/types': 29.6.3
-      '@types/node': 20.11.17
-      chalk: 4.1.2
-      cjs-module-lexer: 1.2.3
-      collect-v8-coverage: 1.0.2
-      glob: 7.2.3
-      graceful-fs: 4.2.11
-      jest-haste-map: 29.7.0
-      jest-message-util: 29.7.0
-      jest-mock: 29.7.0
-      jest-regex-util: 29.6.3
-      jest-resolve: 29.7.0
-      jest-snapshot: 29.7.0
-      jest-util: 29.7.0
-      slash: 3.0.0
-      strip-bom: 4.0.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      define-properties: 1.2.1
+      get-intrinsic: 1.2.2
+      has-symbols: 1.0.3
+      reflect.getprototypeof: 1.0.4
+      set-function-name: 2.0.1
+    dev: false
 
-  /jest-snapshot@29.7.0:
-    resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  /jackspeak@2.3.6:
+    resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
+    engines: {node: '>=14'}
     dependencies:
-      '@babel/core': 7.23.9
-      '@babel/generator': 7.23.6
-      '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9)
-      '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9)
-      '@babel/types': 7.23.9
-      '@jest/expect-utils': 29.7.0
-      '@jest/transform': 29.7.0
-      '@jest/types': 29.6.3
-      babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9)
-      chalk: 4.1.2
-      expect: 29.7.0
-      graceful-fs: 4.2.11
-      jest-diff: 29.7.0
-      jest-get-type: 29.6.3
-      jest-matcher-utils: 29.7.0
-      jest-message-util: 29.7.0
-      jest-util: 29.7.0
-      natural-compare: 1.4.0
-      pretty-format: 29.7.0
-      semver: 7.6.0
-    transitivePeerDependencies:
-      - supports-color
+      '@isaacs/cliui': 8.0.2
+    optionalDependencies:
+      '@pkgjs/parseargs': 0.11.0
     dev: true
 
   /jest-util@29.7.0:
@@ -9897,37 +9354,11 @@ packages:
       graceful-fs: 4.2.11
       picomatch: 2.3.1
 
-  /jest-validate@29.7.0:
-    resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/types': 29.6.3
-      camelcase: 6.3.0
-      chalk: 4.1.2
-      jest-get-type: 29.6.3
-      leven: 3.1.0
-      pretty-format: 29.7.0
-    dev: true
-
-  /jest-watcher@29.7.0:
-    resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/test-result': 29.7.0
-      '@jest/types': 29.6.3
-      '@types/node': 20.11.17
-      ansi-escapes: 4.3.2
-      chalk: 4.1.2
-      emittery: 0.13.1
-      jest-util: 29.7.0
-      string-length: 4.0.2
-    dev: true
-
   /jest-worker@27.5.1:
     resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
     engines: {node: '>= 10.13.0'}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
       merge-stream: 2.0.0
       supports-color: 8.1.1
 
@@ -9935,32 +9366,11 @@ packages:
     resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@types/node': 20.11.14
+      '@types/node': 20.11.17
       jest-util: 29.7.0
       merge-stream: 2.0.0
       supports-color: 8.1.1
 
-  /jest@29.7.0:
-    resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    hasBin: true
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
-    dependencies:
-      '@jest/core': 29.7.0
-      '@jest/types': 29.6.3
-      import-local: 3.1.0
-      jest-cli: 29.7.0
-    transitivePeerDependencies:
-      - '@types/node'
-      - babel-plugin-macros
-      - supports-color
-      - ts-node
-    dev: true
-
   /jiti@1.21.0:
     resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
     hasBin: true
@@ -9987,6 +9397,10 @@ packages:
   /js-tokens@4.0.0:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
 
+  /js-tokens@8.0.3:
+    resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==}
+    dev: true
+
   /js-yaml@3.14.1:
     resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
     hasBin: true
@@ -10220,6 +9634,14 @@ packages:
     resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==}
     engines: {node: '>= 12.13.0'}
 
+  /local-pkg@0.5.0:
+    resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
+    engines: {node: '>=14'}
+    dependencies:
+      mlly: 1.6.0
+      pkg-types: 1.0.3
+    dev: true
+
   /locate-path@3.0.0:
     resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
     engines: {node: '>=6'}
@@ -10321,6 +9743,12 @@ packages:
       underscore: 1.13.6
     dev: false
 
+  /loupe@2.3.7:
+    resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+    dependencies:
+      get-func-name: 2.0.2
+    dev: true
+
   /lower-case@2.0.2:
     resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
     dependencies:
@@ -10406,23 +9834,10 @@ packages:
       '@jridgewell/sourcemap-codec': 1.4.15
     dev: true
 
-  /make-dir@4.0.0:
-    resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
-    engines: {node: '>=10'}
-    dependencies:
-      semver: 7.6.0
-    dev: true
-
   /make-error@1.3.6:
     resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
     dev: true
 
-  /makeerror@1.0.12:
-    resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
-    dependencies:
-      tmpl: 1.0.5
-    dev: true
-
   /mammoth@1.6.0:
     resolution: {integrity: sha512-jOwbj6BwJzxCf6jr2l1zmSemniIkLnchvELXnDJCANlJawhzyIKObIq48B8kWEPLgUUh57k7FtEO3DHFQMnjMg==}
     engines: {node: '>=12.0.0'}
@@ -11150,13 +10565,6 @@ packages:
     dependencies:
       brace-expansion: 1.1.11
 
-  /minimatch@5.1.6:
-    resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
-    engines: {node: '>=10'}
-    dependencies:
-      brace-expansion: 2.0.1
-    dev: true
-
   /minimatch@9.0.3:
     resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
     engines: {node: '>=16 || 14 >=14.17'}
@@ -11215,6 +10623,15 @@ packages:
     hasBin: true
     dev: true
 
+  /mlly@1.6.0:
+    resolution: {integrity: sha512-YOvg9hfYQmnaB56Yb+KrJE2u0Yzz5zR+sLejEvF4fzwzV1Al6hkf2vyHTwqCRyv0hCi9rVCqVoXpyYevQIRwLQ==}
+    dependencies:
+      acorn: 8.11.3
+      pathe: 1.1.2
+      pkg-types: 1.0.3
+      ufo: 1.4.0
+    dev: true
+
   /module-definition@3.4.0:
     resolution: {integrity: sha512-XxJ88R1v458pifaSkPNLUTdSPNVGMP2SXVncVmApGO+gAfrLANiYe6JofymCzVceGOMwQE2xogxBSc8uB7XegA==}
     engines: {node: '>=6.0'}
@@ -11238,7 +10655,7 @@ packages:
     engines: {node: '>=10.13.0'}
     hasBin: true
     dependencies:
-      commander: 2.20.3
+      commander: 2.20.0
       debug: 4.3.4
       glob: 7.2.3
       requirejs: 2.3.6
@@ -11333,7 +10750,7 @@ packages:
   /neo-async@2.6.2:
     resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
 
-  /next@13.5.6(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0):
+  /next@13.5.6(react-dom@18.2.0)(react@18.2.0):
     resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==}
     engines: {node: '>=16.14.0'}
     hasBin: true
@@ -11355,7 +10772,7 @@ packages:
       postcss: 8.4.31
       react: 18.2.0
       react-dom: 18.2.0(react@18.2.0)
-      styled-jsx: 5.1.1(@babel/core@7.23.9)(react@18.2.0)
+      styled-jsx: 5.1.1(react@18.2.0)
       watchpack: 2.4.0
     optionalDependencies:
       '@next/swc-darwin-arm64': 13.5.6
@@ -11372,6 +10789,16 @@ packages:
       - babel-plugin-macros
     dev: true
 
+  /nice-napi@1.0.2:
+    resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==}
+    os: ['!win32']
+    requiresBuild: true
+    dependencies:
+      node-addon-api: 3.2.1
+      node-gyp-build: 4.8.0
+    dev: true
+    optional: true
+
   /no-case@3.0.4:
     resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
     dependencies:
@@ -11385,6 +10812,12 @@ packages:
       semver: 7.6.0
     dev: false
 
+  /node-addon-api@3.2.1:
+    resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==}
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /node-addon-api@6.1.0:
     resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==}
     dev: false
@@ -11420,9 +10853,12 @@ packages:
     resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
     engines: {node: '>= 6.13.0'}
 
-  /node-int64@0.4.0:
-    resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+  /node-gyp-build@4.8.0:
+    resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==}
+    hasBin: true
+    requiresBuild: true
     dev: true
+    optional: true
 
   /node-releases@2.0.14:
     resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
@@ -11475,6 +10911,13 @@ packages:
       - encoding
     dev: false
 
+  /npm-run-path@2.0.2:
+    resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==}
+    engines: {node: '>=4'}
+    dependencies:
+      path-key: 2.0.1
+    dev: true
+
   /npm-run-path@4.0.1:
     resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
     engines: {node: '>=8'}
@@ -11735,6 +11178,13 @@ packages:
       wcwidth: 1.0.1
     dev: true
 
+  /os-filter-obj@2.0.0:
+    resolution: {integrity: sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==}
+    engines: {node: '>=4'}
+    dependencies:
+      arch: 2.2.0
+    dev: true
+
   /os-tmpdir@1.0.2:
     resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
     engines: {node: '>=0.10.0'}
@@ -11790,6 +11240,13 @@ packages:
     dependencies:
       yocto-queue: 1.0.0
 
+  /p-limit@5.0.0:
+    resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==}
+    engines: {node: '>=18'}
+    dependencies:
+      yocto-queue: 1.0.0
+    dev: true
+
   /p-locate@3.0.0:
     resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
     engines: {node: '>=6'}
@@ -11851,7 +11308,7 @@ packages:
       got: 12.6.1
       registry-auth-token: 5.0.2
       registry-url: 6.0.1
-      semver: 7.5.4
+      semver: 7.6.0
 
   /packet-reader@1.0.0:
     resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==}
@@ -11948,6 +11405,11 @@ packages:
   /path-is-inside@1.0.2:
     resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==}
 
+  /path-key@2.0.1:
+    resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==}
+    engines: {node: '>=4'}
+    dev: true
+
   /path-key@3.1.1:
     resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
     engines: {node: '>=8'}
@@ -11985,7 +11447,10 @@ packages:
 
   /pathe@1.1.2:
     resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
-    dev: false
+
+  /pathval@1.1.1:
+    resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+    dev: true
 
   /pdf2json@3.0.5:
     resolution: {integrity: sha512-Un1yLbSlk/zfwrltgguskExIioXZlFSFwsyXU0cnBorLywbTbcdzmJJEebh+U2cFCtR7y8nDs5lPHAe7ldxjZg==}
@@ -12000,7 +11465,6 @@ packages:
   /peek-readable@5.0.0:
     resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==}
     engines: {node: '>=14.16'}
-    dev: false
 
   /periscopic@3.1.0:
     resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
@@ -12107,14 +11571,20 @@ packages:
     hasBin: true
     dev: true
 
+  /pify@2.3.0:
+    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
   /pify@4.0.1:
     resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
     engines: {node: '>=6'}
     dev: true
 
-  /pirates@4.0.6:
-    resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
-    engines: {node: '>= 6'}
+  /piscina@4.3.2:
+    resolution: {integrity: sha512-aXPak3A1LgbfDFrsmgYhQS4J7ElHRFL7iUkUqaiLNDRE69YQSFGqIZiHaXOH4NyC6EdD+awZVeE7MG0zVm9L4Q==}
+    optionalDependencies:
+      nice-napi: 1.0.2
     dev: true
 
   /pkg-dir@4.2.0:
@@ -12130,6 +11600,14 @@ packages:
     dependencies:
       find-up: 6.3.0
 
+  /pkg-types@1.0.3:
+    resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
+    dependencies:
+      jsonc-parser: 3.2.0
+      mlly: 1.6.0
+      pathe: 1.1.2
+    dev: true
+
   /pkg-up@3.1.0:
     resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
     engines: {node: '>=8'}
@@ -12567,6 +12045,15 @@ packages:
       picocolors: 1.0.0
       source-map-js: 1.0.2
 
+  /postcss@8.4.35:
+    resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.7
+      picocolors: 1.0.0
+      source-map-js: 1.0.2
+    dev: true
+
   /postgres-array@2.0.0:
     resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
     engines: {node: '>=4'}
@@ -12720,11 +12207,6 @@ packages:
     hasBin: true
     dev: true
 
-  /pretty-bytes@5.6.0:
-    resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
-    engines: {node: '>=6'}
-    dev: true
-
   /pretty-error@4.0.0:
     resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==}
     dependencies:
@@ -12819,7 +12301,7 @@ packages:
       '@protobufjs/pool': 1.1.0
       '@protobufjs/utf8': 1.1.0
       '@types/long': 4.0.2
-      '@types/node': 18.19.14
+      '@types/node': 20.11.17
       long: 4.0.0
     dev: false
 
@@ -12857,10 +12339,6 @@ packages:
     dependencies:
       escape-goat: 4.0.0
 
-  /pure-rand@6.0.4:
-    resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==}
-    dev: true
-
   /qs@6.11.0:
     resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
     engines: {node: '>=0.6'}
@@ -12899,12 +12377,6 @@ packages:
     resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==}
     dev: true
 
-  /r-json@1.3.0:
-    resolution: {integrity: sha512-xesd+RHCpymPCYd9DvDvUr1w1IieSChkqYF1EpuAYrvCfLXji9NP36DvyYZJZZB5soVDvZ0WUtBoZaU1g5Yt9A==}
-    dependencies:
-      w-json: 1.3.10
-    dev: true
-
   /rake-modified@1.0.8:
     resolution: {integrity: sha512-rj/1t+EyI8Ly52eaCeSy5hoNpdNnDlNQ/+jll2DypR6nkuxotMbaupzwbuMSaXzuSL1I2pYVYy7oPus/Ls49ag==}
     dependencies:
@@ -13207,7 +12679,6 @@ packages:
     engines: {node: '>=8'}
     dependencies:
       readable-stream: 3.6.2
-    dev: false
 
   /readdirp@3.6.0:
     resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
@@ -13467,13 +12938,6 @@ packages:
   /resolve-alpn@1.2.1:
     resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
 
-  /resolve-cwd@3.0.0:
-    resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
-    engines: {node: '>=8'}
-    dependencies:
-      resolve-from: 5.0.0
-    dev: true
-
   /resolve-dependency-path@2.0.0:
     resolution: {integrity: sha512-DIgu+0Dv+6v2XwRaNWnumKu7GPufBBOr5I1gRPJHkvghrfCGOooJODFvgFimX/KRxk9j0whD2MnKHzM1jYvk9w==}
     engines: {node: '>=6.0.0'}
@@ -13493,11 +12957,7 @@ packages:
 
   /resolve-pkg-maps@1.0.0:
     resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
-
-  /resolve.exports@2.0.2:
-    resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==}
-    engines: {node: '>=10'}
-    dev: true
+    dev: false
 
   /resolve@1.22.8:
     resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
@@ -13583,64 +13043,26 @@ packages:
       glob: 10.3.10
     dev: true
 
-  /rollup-plugin-dts@6.1.0(rollup@4.9.5)(typescript@5.3.3):
-    resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==}
-    engines: {node: '>=16'}
-    peerDependencies:
-      rollup: ^3.29.4 || ^4
-      typescript: ^4.5 || ^5.0
-    dependencies:
-      magic-string: 0.30.7
-      rollup: 4.9.5
-      typescript: 5.3.3
-    optionalDependencies:
-      '@babel/code-frame': 7.23.5
-    dev: true
-
-  /rollup-plugin-swc3@0.11.0(@swc/core@1.3.107)(rollup@4.9.5):
-    resolution: {integrity: sha512-luB9Ngb1YieWPpJttKvkmjN3lG5l28SmASLbf2CoScUB2+EImU0bE8wX4EYKEqv5clVulhWRQHQvE+H33X/03g==}
-    engines: {node: '>=12'}
-    peerDependencies:
-      '@swc/core': '>=1.2.165'
-      rollup: ^2.0.0 || ^3.0.0 || ^4.0.0
-    dependencies:
-      '@fastify/deepmerge': 1.3.0
-      '@rollup/pluginutils': 5.1.0(rollup@4.9.5)
-      '@swc/core': 1.3.107(@swc/helpers@0.5.3)
-      get-tsconfig: 4.7.2
-      rollup: 4.9.5
-      rollup-preserve-directives: 1.1.1(rollup@4.9.5)
-    dev: true
-
-  /rollup-preserve-directives@1.1.1(rollup@4.9.5):
-    resolution: {integrity: sha512-+eQafbuEfDPfxQ9hQPlwaROfin4yiVRxap8hnrvvvcSGoukv1tTiYpAW9mvm3uR8J+fe4xd8FdVd5rz9q7jZ+Q==}
-    peerDependencies:
-      rollup: ^2.0.0 || ^3.0.0 || ^4.0.0
-    dependencies:
-      magic-string: 0.30.7
-      rollup: 4.9.5
-    dev: true
-
-  /rollup@4.9.5:
-    resolution: {integrity: sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==}
+  /rollup@4.12.0:
+    resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
     dependencies:
       '@types/estree': 1.0.5
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.9.5
-      '@rollup/rollup-android-arm64': 4.9.5
-      '@rollup/rollup-darwin-arm64': 4.9.5
-      '@rollup/rollup-darwin-x64': 4.9.5
-      '@rollup/rollup-linux-arm-gnueabihf': 4.9.5
-      '@rollup/rollup-linux-arm64-gnu': 4.9.5
-      '@rollup/rollup-linux-arm64-musl': 4.9.5
-      '@rollup/rollup-linux-riscv64-gnu': 4.9.5
-      '@rollup/rollup-linux-x64-gnu': 4.9.5
-      '@rollup/rollup-linux-x64-musl': 4.9.5
-      '@rollup/rollup-win32-arm64-msvc': 4.9.5
-      '@rollup/rollup-win32-ia32-msvc': 4.9.5
-      '@rollup/rollup-win32-x64-msvc': 4.9.5
+      '@rollup/rollup-android-arm-eabi': 4.12.0
+      '@rollup/rollup-android-arm64': 4.12.0
+      '@rollup/rollup-darwin-arm64': 4.12.0
+      '@rollup/rollup-darwin-x64': 4.12.0
+      '@rollup/rollup-linux-arm-gnueabihf': 4.12.0
+      '@rollup/rollup-linux-arm64-gnu': 4.12.0
+      '@rollup/rollup-linux-arm64-musl': 4.12.0
+      '@rollup/rollup-linux-riscv64-gnu': 4.12.0
+      '@rollup/rollup-linux-x64-gnu': 4.12.0
+      '@rollup/rollup-linux-x64-musl': 4.12.0
+      '@rollup/rollup-win32-arm64-msvc': 4.12.0
+      '@rollup/rollup-win32-ia32-msvc': 4.12.0
+      '@rollup/rollup-win32-x64-msvc': 4.12.0
       fsevents: 2.3.3
     dev: true
 
@@ -13663,6 +13085,12 @@ packages:
     dependencies:
       queue-microtask: 1.2.3
 
+  /rxjs@7.8.1:
+    resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+    dependencies:
+      tslib: 2.6.2
+    dev: true
+
   /safe-array-concat@1.1.0:
     resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==}
     engines: {node: '>=0.4'}
@@ -13707,7 +13135,7 @@ packages:
     engines: {node: '>=6.0.0'}
     hasBin: true
     dependencies:
-      commander: 2.20.3
+      commander: 2.20.0
     dev: true
 
   /sax@1.3.0:
@@ -13769,7 +13197,19 @@ packages:
     resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==}
     engines: {node: '>=12'}
     dependencies:
-      semver: 7.5.4
+      semver: 7.6.0
+
+  /semver-regex@4.0.5:
+    resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /semver-truncate@3.0.0:
+    resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==}
+    engines: {node: '>=12'}
+    dependencies:
+      semver: 7.6.0
+    dev: true
 
   /semver@5.7.2:
     resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
@@ -13882,14 +13322,6 @@ packages:
       functions-have-names: 1.2.3
       has-property-descriptors: 1.0.1
 
-  /set-value@4.1.0:
-    resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==}
-    engines: {node: '>=11.0'}
-    dependencies:
-      is-plain-object: 2.0.4
-      is-primitive: 3.0.1
-    dev: true
-
   /setimmediate@1.0.5:
     resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
     dev: false
@@ -13974,6 +13406,10 @@ packages:
       get-intrinsic: 1.2.2
       object-inspect: 1.13.1
 
+  /siginfo@2.0.0:
+    resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+    dev: true
+
   /signal-exit@3.0.7:
     resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
 
@@ -14081,17 +13517,24 @@ packages:
     resolution: {integrity: sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==}
     engines: {node: '>= 6.3.0'}
 
-  /source-map-js@1.0.2:
-    resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+  /sort-keys-length@1.0.1:
+    resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==}
     engines: {node: '>=0.10.0'}
+    dependencies:
+      sort-keys: 1.1.2
+    dev: true
 
-  /source-map-support@0.5.13:
-    resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
+  /sort-keys@1.1.2:
+    resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
-      buffer-from: 1.1.2
-      source-map: 0.6.1
+      is-plain-obj: 1.1.0
     dev: true
 
+  /source-map-js@1.0.2:
+    resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+    engines: {node: '>=0.10.0'}
+
   /source-map-support@0.5.21:
     resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
     dependencies:
@@ -14115,6 +13558,10 @@ packages:
       memory-pager: 1.5.0
     dev: false
 
+  /spawn-command@0.0.2:
+    resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==}
+    dev: true
+
   /spawndamnit@2.0.0:
     resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==}
     dependencies:
@@ -14189,11 +13636,8 @@ packages:
     resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
     dev: false
 
-  /stack-utils@2.0.6:
-    resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      escape-string-regexp: 2.0.0
+  /stackback@0.0.2:
+    resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
     dev: true
 
   /statuses@1.5.0:
@@ -14249,14 +13693,6 @@ packages:
       rfdc: 1.3.1
     dev: false
 
-  /string-length@4.0.2:
-    resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      char-regex: 1.0.2
-      strip-ansi: 6.0.1
-    dev: true
-
   /string-strip-html@13.4.6:
     resolution: {integrity: sha512-I1uUTS/BGQ/3jj+9WF6GENATSUPy9UruqVHdvAikOqlvFvlOAQL8M3qjoLu60Usp2x3yJpnAYtUTzDYiDdqXqg==}
     engines: {node: '>=14.18.0'}
@@ -14418,9 +13854,9 @@ packages:
     resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
     engines: {node: '>=4'}
 
-  /strip-bom@4.0.0:
-    resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
-    engines: {node: '>=8'}
+  /strip-eof@1.0.0:
+    resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==}
+    engines: {node: '>=0.10.0'}
     dev: true
 
   /strip-final-newline@2.0.0:
@@ -14447,13 +13883,23 @@ packages:
     resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
     engines: {node: '>=8'}
 
+  /strip-literal@2.0.0:
+    resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==}
+    dependencies:
+      js-tokens: 8.0.3
+    dev: true
+
+  /strip-outer@2.0.0:
+    resolution: {integrity: sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dev: true
+
   /strtok3@7.0.0:
     resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==}
     engines: {node: '>=14.16'}
     dependencies:
       '@tokenizer/token': 0.3.0
       peek-readable: 5.0.0
-    dev: false
 
   /style-to-object@0.4.4:
     resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==}
@@ -14465,7 +13911,7 @@ packages:
     dependencies:
       inline-style-parser: 0.2.2
 
-  /styled-jsx@5.1.1(@babel/core@7.23.9)(react@18.2.0):
+  /styled-jsx@5.1.1(react@18.2.0):
     resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
     engines: {node: '>= 12.0.0'}
     peerDependencies:
@@ -14478,7 +13924,6 @@ packages:
       babel-plugin-macros:
         optional: true
     dependencies:
-      '@babel/core': 7.23.9
       client-only: 0.0.1
       react: 18.2.0
     dev: true
@@ -14498,7 +13943,7 @@ packages:
     engines: {node: '>=6.0.0'}
     hasBin: true
     dependencies:
-      commander: 2.20.3
+      commander: 2.20.0
       debug: 4.3.4
     transitivePeerDependencies:
       - supports-color
@@ -14673,18 +14118,9 @@ packages:
     dependencies:
       '@jridgewell/source-map': 0.3.5
       acorn: 8.11.3
-      commander: 2.20.3
+      commander: 2.20.0
       source-map-support: 0.5.21
 
-  /test-exclude@6.0.0:
-    resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
-    engines: {node: '>=8'}
-    dependencies:
-      '@istanbuljs/schema': 0.1.3
-      glob: 7.2.3
-      minimatch: 3.1.2
-    dev: true
-
   /text-hex@1.0.0:
     resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
     dev: false
@@ -14714,6 +14150,20 @@ packages:
   /tiny-warning@1.0.3:
     resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
 
+  /tinybench@2.6.0:
+    resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==}
+    dev: true
+
+  /tinypool@0.8.2:
+    resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==}
+    engines: {node: '>=14.0.0'}
+    dev: true
+
+  /tinyspy@2.2.1:
+    resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==}
+    engines: {node: '>=14.0.0'}
+    dev: true
+
   /tmp@0.0.33:
     resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
     engines: {node: '>=0.6.0'}
@@ -14721,10 +14171,6 @@ packages:
       os-tmpdir: 1.0.2
     dev: true
 
-  /tmpl@1.0.5:
-    resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
-    dev: true
-
   /to-fast-properties@2.0.0:
     resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
     engines: {node: '>=4'}
@@ -14750,7 +14196,6 @@ packages:
     dependencies:
       '@tokenizer/token': 0.3.0
       ieee754: 1.2.1
-    dev: false
 
   /totalist@3.0.1:
     resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
@@ -14767,6 +14212,11 @@ packages:
       punycode: 2.3.1
     dev: false
 
+  /tree-kill@1.2.2:
+    resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
+    hasBin: true
+    dev: true
+
   /trim-lines@3.0.1:
     resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
 
@@ -14775,6 +14225,13 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /trim-repeated@2.0.0:
+    resolution: {integrity: sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==}
+    engines: {node: '>=12'}
+    dependencies:
+      escape-string-regexp: 5.0.0
+    dev: true
+
   /triple-beam@1.4.1:
     resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
     engines: {node: '>= 14.0.0'}
@@ -14797,40 +14254,6 @@ packages:
     engines: {node: '>=14.16'}
     dev: true
 
-  /ts-jest@29.1.2(@babel/core@7.23.9)(jest@29.7.0)(typescript@5.3.3):
-    resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==}
-    engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0}
-    hasBin: true
-    peerDependencies:
-      '@babel/core': '>=7.0.0-beta.0 <8'
-      '@jest/types': ^29.0.0
-      babel-jest: ^29.0.0
-      esbuild: '*'
-      jest: ^29.0.0
-      typescript: '>=4.3 <6'
-    peerDependenciesMeta:
-      '@babel/core':
-        optional: true
-      '@jest/types':
-        optional: true
-      babel-jest:
-        optional: true
-      esbuild:
-        optional: true
-    dependencies:
-      '@babel/core': 7.23.9
-      bs-logger: 0.2.6
-      fast-json-stable-stringify: 2.1.0
-      jest: 29.7.0
-      jest-util: 29.7.0
-      json5: 2.2.3
-      lodash.memoize: 4.1.2
-      make-error: 1.3.6
-      semver: 7.6.0
-      typescript: 5.3.3
-      yargs-parser: 21.1.1
-    dev: true
-
   /ts-node@10.9.2(@types/node@18.19.10)(typescript@5.3.3):
     resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
     hasBin: true
@@ -15043,11 +14466,6 @@ packages:
     resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
     engines: {node: '>=10'}
 
-  /type-fest@0.21.3:
-    resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
-    engines: {node: '>=10'}
-    dev: true
-
   /type-fest@0.6.0:
     resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
     engines: {node: '>=8'}
@@ -15157,6 +14575,10 @@ packages:
     engines: {node: '>=14.17'}
     hasBin: true
 
+  /ufo@1.4.0:
+    resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==}
+    dev: true
+
   /uglify-js@3.17.4:
     resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==}
     engines: {node: '>=0.8.0'}
@@ -15366,15 +14788,6 @@ packages:
     resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
     dev: true
 
-  /v8-to-istanbul@9.2.0:
-    resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==}
-    engines: {node: '>=10.12.0'}
-    dependencies:
-      '@jridgewell/trace-mapping': 0.3.22
-      '@types/istanbul-lib-coverage': 2.0.6
-      convert-source-map: 2.0.0
-    dev: true
-
   /validate-npm-package-license@3.0.4:
     resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
     dependencies:
@@ -15414,6 +14827,117 @@ packages:
       unist-util-stringify-position: 4.0.0
       vfile-message: 4.0.2
 
+  /vite-node@1.3.1:
+    resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+    dependencies:
+      cac: 6.7.14
+      debug: 4.3.4
+      pathe: 1.1.2
+      picocolors: 1.0.0
+      vite: 5.1.4
+    transitivePeerDependencies:
+      - '@types/node'
+      - less
+      - lightningcss
+      - sass
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+    dev: true
+
+  /vite@5.1.4:
+    resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': ^18.0.0 || >=20.0.0
+      less: '*'
+      lightningcss: ^1.21.0
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      lightningcss:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+    dependencies:
+      esbuild: 0.19.12
+      postcss: 8.4.35
+      rollup: 4.12.0
+    optionalDependencies:
+      fsevents: 2.3.3
+    dev: true
+
+  /vitest@1.3.1:
+    resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+    peerDependencies:
+      '@edge-runtime/vm': '*'
+      '@types/node': ^18.0.0 || >=20.0.0
+      '@vitest/browser': 1.3.1
+      '@vitest/ui': 1.3.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
+    dependencies:
+      '@vitest/expect': 1.3.1
+      '@vitest/runner': 1.3.1
+      '@vitest/snapshot': 1.3.1
+      '@vitest/spy': 1.3.1
+      '@vitest/utils': 1.3.1
+      acorn-walk: 8.3.2
+      chai: 4.4.1
+      debug: 4.3.4
+      execa: 8.0.1
+      local-pkg: 0.5.0
+      magic-string: 0.30.7
+      pathe: 1.1.2
+      picocolors: 1.0.0
+      std-env: 3.7.0
+      strip-literal: 2.0.0
+      tinybench: 2.6.0
+      tinypool: 0.8.2
+      vite: 5.1.4
+      vite-node: 1.3.1
+      why-is-node-running: 2.2.2
+    transitivePeerDependencies:
+      - less
+      - lightningcss
+      - sass
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+    dev: true
+
   /vscode-oniguruma@1.7.0:
     resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==}
     dev: true
@@ -15422,10 +14946,6 @@ packages:
     resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==}
     dev: true
 
-  /w-json@1.3.10:
-    resolution: {integrity: sha512-XadVyw0xE+oZ5FGApXsdswv96rOhStzKqL53uSe5UaTadABGkWIg1+DTx8kiZ/VqTZTBneoL0l65RcPe4W3ecw==}
-    dev: true
-
   /wait-port@1.1.0:
     resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==}
     engines: {node: '>=10'}
@@ -15443,12 +14963,6 @@ packages:
     engines: {node: '>=6.0.0'}
     dev: true
 
-  /walker@1.0.8:
-    resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
-    dependencies:
-      makeerror: 1.0.12
-    dev: true
-
   /watchpack@2.4.0:
     resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
     engines: {node: '>=10.13.0'}
@@ -15790,6 +15304,15 @@ packages:
     dependencies:
       isexe: 2.0.0
 
+  /why-is-node-running@2.2.2:
+    resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==}
+    engines: {node: '>=8'}
+    hasBin: true
+    dependencies:
+      siginfo: 2.0.0
+      stackback: 0.0.2
+    dev: true
+
   /widest-line@4.0.1:
     resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==}
     engines: {node: '>=12'}
@@ -15878,14 +15401,6 @@ packages:
       signal-exit: 3.0.7
       typedarray-to-buffer: 3.1.5
 
-  /write-file-atomic@4.0.2:
-    resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
-    engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
-    dependencies:
-      imurmurhash: 0.1.4
-      signal-exit: 3.0.7
-    dev: true
-
   /ws@7.5.9:
     resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==}
     engines: {node: '>=8.3.0'}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index ba8101a4589d6459fcd9dfc03e26803d85851834..7d4e0da24087f4c18084b92100a692a4ce54b1b0 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,5 +1,6 @@
 packages:
   - "apps/*"
   - "packages/*"
+  - "packages/core/tests"
   - "examples/"
   - "examples/*"
diff --git a/tsconfig.json b/tsconfig.json
index b63bcb9ca6b4be46b218c40cebb7717abb72615b..a4123d728d76f0dfa862aecd55a88c324c53cadb 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -18,7 +18,13 @@
       "path": "./apps/docs/tsconfig.json"
     },
     {
-      "path": "./packages/core"
+      "path": "./packages/core/tsconfig.json"
+    },
+    {
+      "path": "./packages/core/tests/tsconfig.json"
+    },
+    {
+      "path": "./packages/env/tsconfig.json"
     },
     {
       "path": "./packages/create-llama"
diff --git a/turbo.json b/turbo.json
index 6f914705c09d71c2c77829abf624934f37d4b202..1a3afa7f49b47ce01796fb4d046ce7ef26dbe65f 100644
--- a/turbo.json
+++ b/turbo.json
@@ -7,7 +7,9 @@
       "outputs": ["dist/**", "build/**"]
     },
     "lint": {},
-    "test": {},
+    "test": {
+      "dependsOn": ["^build"]
+    },
     "dev": {
       "cache": false,
       "persistent": true