diff --git a/packages/core/package.json b/packages/core/package.json
index 99ccdd1f0704d8f4113658f0111cfccb1a6bc3fa..b0057b8930b0b1ca4d89e2d0722c38ecb6ea23a7 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -4,6 +4,34 @@
   "version": "0.2.6",
   "description": "LlamaIndex Core Module",
   "exports": {
+    "./agent": {
+      "require": {
+        "types": "./dist/agent/index.d.cts",
+        "default": "./dist/agent/index.cjs"
+      },
+      "import": {
+        "types": "./dist/agent/index.d.ts",
+        "default": "./dist/agent/index.js"
+      },
+      "default": {
+        "types": "./dist/agent/index.d.ts",
+        "default": "./dist/agent/index.js"
+      }
+    },
+    "./objects": {
+      "require": {
+        "types": "./dist/objects/index.d.cts",
+        "default": "./dist/objects/index.cjs"
+      },
+      "import": {
+        "types": "./dist/objects/index.d.ts",
+        "default": "./dist/objects/index.js"
+      },
+      "default": {
+        "types": "./dist/objects/index.d.ts",
+        "default": "./dist/objects/index.js"
+      }
+    },
     "./node-parser": {
       "require": {
         "types": "./dist/node-parser/index.d.cts",
diff --git a/packages/llamaindex/src/agent/base.ts b/packages/core/src/agent/base.ts
similarity index 95%
rename from packages/llamaindex/src/agent/base.ts
rename to packages/core/src/agent/base.ts
index 2cc2233ca63e897c68c98a54299897a1d7b89854..98afd8293ba7b7ef74bbfbaf82f0fdfa39124d1a 100644
--- a/packages/llamaindex/src/agent/base.ts
+++ b/packages/core/src/agent/base.ts
@@ -1,23 +1,21 @@
+import { consoleLogger, emptyLogger, randomUUID } from "@llamaindex/env";
 import {
   BaseChatEngine,
   type NonStreamingChatEngineParams,
   type StreamingChatEngineParams,
-} from "@llamaindex/core/chat-engine";
+} from "../chat-engine";
+import { Settings } from "../global";
 import type {
   BaseToolWithCall,
   ChatMessage,
   LLM,
   MessageContent,
   ToolOutput,
-} from "@llamaindex/core/llms";
-import { BaseMemory } from "@llamaindex/core/memory";
-import { EngineResponse } from "@llamaindex/core/schema";
-import { wrapEventCaller } from "@llamaindex/core/utils";
-import { randomUUID } from "@llamaindex/env";
-import { Settings } from "../Settings.js";
-import { consoleLogger, emptyLogger } from "../internal/logger.js";
-import { isReadableStream } from "../internal/utils.js";
-import { ObjectRetriever } from "../objects/index.js";
+} from "../llms";
+import { BaseMemory } from "../memory";
+import type { ObjectRetriever } from "../objects";
+import { EngineResponse } from "../schema";
+import { wrapEventCaller } from "../utils";
 import type {
   AgentTaskContext,
   TaskHandler,
@@ -374,7 +372,7 @@ export abstract class AgentRunner<
       this.#chatHistory = [...stepOutput.taskStep.context.store.messages];
       if (stepOutput.isLast) {
         const { output } = stepOutput;
-        if (isReadableStream(output)) {
+        if (output instanceof ReadableStream) {
           return output.pipeThrough<EngineResponse>(
             new TransformStream({
               transform(chunk, controller) {
diff --git a/packages/core/src/agent/index.ts b/packages/core/src/agent/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1599230a549a28542151fc308b24ef7f2eff31db
--- /dev/null
+++ b/packages/core/src/agent/index.ts
@@ -0,0 +1,11 @@
+export { AgentRunner, AgentWorker, type AgentParamsBase } from "./base.js";
+export { LLMAgent, LLMAgentWorker, type LLMAgentParams } from "./llm.js";
+export type { AgentEndEvent, AgentStartEvent, TaskHandler } from "./types.js";
+export {
+  callTool,
+  consumeAsyncIterable,
+  createReadableStream,
+  stepTools,
+  stepToolsStreaming,
+  validateAgentParams,
+} from "./utils.js";
diff --git a/packages/llamaindex/src/agent/llm.ts b/packages/core/src/agent/llm.ts
similarity index 88%
rename from packages/llamaindex/src/agent/llm.ts
rename to packages/core/src/agent/llm.ts
index 6292c1cd71e4261fada4284765a0178617430f2e..5050ee2a8fb180b3d63372f72a91bec3826489b1 100644
--- a/packages/llamaindex/src/agent/llm.ts
+++ b/packages/core/src/agent/llm.ts
@@ -1,6 +1,6 @@
-import type { BaseToolWithCall, LLM } from "@llamaindex/core/llms";
-import { ObjectRetriever } from "../objects/index.js";
-import { Settings } from "../Settings.js";
+import { Settings } from "../global";
+import type { BaseToolWithCall, LLM } from "../llms";
+import { ObjectRetriever } from "../objects";
 import { AgentRunner, AgentWorker, type AgentParamsBase } from "./base.js";
 import { validateAgentParams } from "./utils.js";
 
diff --git a/packages/llamaindex/src/agent/types.ts b/packages/core/src/agent/types.ts
similarity index 94%
rename from packages/llamaindex/src/agent/types.ts
rename to packages/core/src/agent/types.ts
index 40765139cd2e3cca2e6e95e82ab2ac57c29a81f8..d6c951d359d78433aa4f6b03595c9589076f8c72 100644
--- a/packages/llamaindex/src/agent/types.ts
+++ b/packages/core/src/agent/types.ts
@@ -1,3 +1,5 @@
+import type { Logger } from "@llamaindex/env";
+import type { UUID } from "../global";
 import type {
   BaseToolWithCall,
   ChatMessage,
@@ -6,9 +8,7 @@ import type {
   LLM,
   MessageContent,
   ToolOutput,
-} from "@llamaindex/core/llms";
-import type { Logger } from "../internal/logger.js";
-import type { UUID } from "../types.js";
+} from "../llms";
 
 export type AgentTaskContext<
   Model extends LLM,
diff --git a/packages/llamaindex/src/agent/utils.ts b/packages/core/src/agent/utils.ts
similarity index 96%
rename from packages/llamaindex/src/agent/utils.ts
rename to packages/core/src/agent/utils.ts
index 9e6502e61b685256a2eba3fc17b296ca1b1a87dd..94d740eeae2da59b579beed885bc9851a64f52e3 100644
--- a/packages/llamaindex/src/agent/utils.ts
+++ b/packages/core/src/agent/utils.ts
@@ -1,8 +1,6 @@
-import {
-  type JSONObject,
-  type JSONValue,
-  Settings,
-} from "@llamaindex/core/global";
+import type { Logger } from "@llamaindex/env";
+import { z } from "zod";
+import { type JSONObject, type JSONValue, Settings } from "../global";
 import type {
   BaseTool,
   ChatMessage,
@@ -14,15 +12,13 @@ import type {
   ToolCall,
   ToolCallLLMMessageOptions,
   ToolOutput,
-} from "@llamaindex/core/llms";
-import { baseToolWithCallSchema } from "@llamaindex/core/schema";
-import { z } from "zod";
-import type { Logger } from "../internal/logger.js";
+} from "../llms";
+import { baseToolWithCallSchema } from "../schema";
 import {
   isAsyncIterable,
   prettifyError,
   stringifyJSONToMessageContent,
-} from "../internal/utils.js";
+} from "../utils";
 import type { AgentParamsBase } from "./base.js";
 import type { TaskHandler } from "./types.js";
 
diff --git a/packages/core/src/global/index.ts b/packages/core/src/global/index.ts
index 78167fb407f0e42ae0141b418a49bf0e1d88821b..5859b4857009e14745c665755f42e60a40ecaa03 100644
--- a/packages/core/src/global/index.ts
+++ b/packages/core/src/global/index.ts
@@ -9,4 +9,4 @@ export type {
   LLMToolResultEvent,
   LlamaIndexEventMaps,
 } from "./settings/callback-manager";
-export type { JSONArray, JSONObject, JSONValue } from "./type";
+export type { JSONArray, JSONObject, JSONValue, UUID } from "./type";
diff --git a/packages/core/src/global/settings.ts b/packages/core/src/global/settings.ts
index e01901d458f9265bd5de28ecee4fb33092027e68..5b49d9d75d8a5f15bef891a2fed8f93927cd1031 100644
--- a/packages/core/src/global/settings.ts
+++ b/packages/core/src/global/settings.ts
@@ -1,4 +1,4 @@
-import type { Tokenizer } from "@llamaindex/env";
+import { getEnv, type Tokenizer } from "@llamaindex/env";
 import type { LLM } from "../llms";
 import {
   type CallbackManager,
@@ -61,4 +61,16 @@ export const Settings = {
   ): Result {
     return withCallbackManager(callbackManager, fn);
   },
+
+  get debug() {
+    let debug = getEnv("DEBUG");
+    if (typeof window !== "undefined") {
+      debug ||= window.localStorage.debug;
+    }
+    return (
+      (Boolean(debug) && debug?.includes("llamaindex")) ||
+      debug === "*" ||
+      debug === "true"
+    );
+  },
 };
diff --git a/packages/core/src/global/settings/callback-manager.ts b/packages/core/src/global/settings/callback-manager.ts
index bce2f7237742be561e328927168640bb3075d059..36a309514471a06d56b30f4463138fddd0994fa8 100644
--- a/packages/core/src/global/settings/callback-manager.ts
+++ b/packages/core/src/global/settings/callback-manager.ts
@@ -1,4 +1,5 @@
 import { AsyncLocalStorage, CustomEvent } from "@llamaindex/env";
+import type { AgentEndEvent, AgentStartEvent } from "../../agent";
 import type {
   ChatMessage,
   ChatResponse,
@@ -72,6 +73,8 @@ export interface LlamaIndexEventMaps {
   "synthesize-end": SynthesizeEndEvent;
   "retrieve-start": RetrieveStartEvent;
   "retrieve-end": RetrieveEndEvent;
+  "agent-start": AgentStartEvent;
+  "agent-end": AgentEndEvent;
 }
 
 export class LlamaIndexCustomEvent<T = any> extends CustomEvent<T> {
diff --git a/packages/core/src/objects/index.ts b/packages/core/src/objects/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d1810d5d96643d1db8741485b6ea6121ef445011
--- /dev/null
+++ b/packages/core/src/objects/index.ts
@@ -0,0 +1,78 @@
+/**
+ * @todo refactor this module, most of the part is broken
+ *  reference
+ *    - https://github.com/run-llama/LlamaIndexTS/pull/531
+ *    - https://github.com/run-llama/LlamaIndexTS/pull/416
+ */
+import type { MessageContent } from "../llms";
+import { BaseRetriever } from "../retriever";
+import { BaseNode, TextNode } from "../schema";
+import { extractText } from "../utils";
+
+// 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
+export abstract class BaseObjectNodeMapping {
+  // TypeScript doesn't support Python's classmethod directly, but we can use static methods as an alternative
+  abstract fromObjects<OT>(objs: OT[], ...args: any[]): BaseObjectNodeMapping;
+
+  // Abstract methods in TypeScript
+  abstract objNodeMapping(): Record<any, any>;
+  abstract toNode(obj: any): TextNode;
+
+  // Concrete methods can be defined as usual
+  validateObject(obj: any): void {}
+
+  // Implementing the add object logic
+  addObj(obj: any): void {
+    this.validateObject(obj);
+    this._addObj(obj);
+  }
+
+  // Abstract method for internal add object logic
+  abstract _addObj(obj: any): void;
+
+  // Implementing toNodes method
+  toNodes(objs: any[]): TextNode[] {
+    return objs.map((obj) => this.toNode(obj));
+  }
+
+  // Abstract method for internal from node logic
+  abstract _fromNode(node: BaseNode): any;
+
+  // Implementing fromNode method
+  fromNode(node: BaseNode): any {
+    const obj = this._fromNode(node);
+    this.validateObject(obj);
+    return obj;
+  }
+
+  // Abstract methods for persistence
+  abstract persist(persistDir: string, objNodeMappingFilename: string): void;
+}
+
+export class ObjectRetriever<T = unknown> {
+  _retriever: BaseRetriever;
+  _objectNodeMapping: BaseObjectNodeMapping;
+
+  constructor(
+    retriever: BaseRetriever,
+    objectNodeMapping: BaseObjectNodeMapping,
+  ) {
+    this._retriever = retriever;
+    this._objectNodeMapping = objectNodeMapping;
+  }
+
+  // In TypeScript, getters are defined like this.
+  get retriever(): BaseRetriever {
+    return this._retriever;
+  }
+
+  // Translating the retrieve method
+  async retrieve(strOrQueryBundle: MessageContent): Promise<T[]> {
+    const nodes = await this.retriever.retrieve({
+      query: extractText(strOrQueryBundle),
+    });
+    const objs = nodes.map((n) => this._objectNodeMapping.fromNode(n.node));
+    return objs;
+  }
+}
diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts
index d589702dd564f57119e4850b1f93ac44b2a6aaa6..fa6d89629167d866f7cbea2554f6532ae68090f6 100644
--- a/packages/core/src/utils/index.ts
+++ b/packages/core/src/utils/index.ts
@@ -1,4 +1,12 @@
-export { EventCaller, getEventCaller, wrapEventCaller } from "./event-caller";
+import type { JSONValue } from "../global";
+
+export {
+  EventCaller,
+  getEventCaller,
+  isAsyncIterable,
+  isIterable,
+  wrapEventCaller,
+} from "./event-caller";
 
 export async function* streamConverter<S, D>(
   stream: AsyncIterable<S>,
@@ -44,6 +52,21 @@ export async function* streamReducer<S, D>(params: {
   }
 }
 
+/**
+ * Prettify an error for AI to read
+ */
+export function prettifyError(error: unknown): string {
+  if (error instanceof Error) {
+    return `Error(${error.name}): ${error.message}`;
+  } else {
+    return `${error}`;
+  }
+}
+
+export function stringifyJSONToMessageContent(value: JSONValue): string {
+  return JSON.stringify(value, null, 2).replace(/"([^"]*)"/g, "$1");
+}
+
 export { wrapLLMEvent } from "./wrap-llm-event";
 
 export {
diff --git a/packages/llamaindex/tests/agents.test.ts b/packages/core/tests/agents.test.ts
similarity index 91%
rename from packages/llamaindex/tests/agents.test.ts
rename to packages/core/tests/agents.test.ts
index f61f9f4b5150fe8cbe5285d6045efe3bcf3d3c69..ca55937a5ee0a6a6852741df341596db00164517 100644
--- a/packages/llamaindex/tests/agents.test.ts
+++ b/packages/core/tests/agents.test.ts
@@ -1,4 +1,4 @@
-import { validateAgentParams } from "llamaindex/agent/utils";
+import { validateAgentParams } from "@llamaindex/core/agent";
 import { expect, test } from "vitest";
 import { ZodError } from "zod";
 
diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json
index e225d02d8d70b446b0efcf41a8ee2b62593f33ec..207b319ffeae1081ed9473dd50e585e7d76509e9 100644
--- a/packages/core/tsconfig.json
+++ b/packages/core/tsconfig.json
@@ -8,7 +8,7 @@
     "moduleResolution": "Bundler",
     "skipLibCheck": true,
     "strict": true,
-    "lib": ["ESNext", "DOM"],
+    "lib": ["ESNext", "DOM", "DOM.AsyncIterable"],
     "types": ["node"]
   },
   "include": ["./src"],
diff --git a/packages/env/src/index.browser.ts b/packages/env/src/index.browser.ts
index fa0c505ef1b5fbf0d5fda6502ba17ab2743a3b97..d6ec0fa8284402eecfb3974a131de9c9ec485b43 100644
--- a/packages/env/src/index.browser.ts
+++ b/packages/env/src/index.browser.ts
@@ -6,6 +6,7 @@
 import "./global-check.js";
 export * from "./web-polyfill.js";
 
+export { consoleLogger, emptyLogger, type Logger } from "./logger/index.js";
 export {
   loadTransformers,
   setTransformers,
diff --git a/packages/env/src/index.edge-light.ts b/packages/env/src/index.edge-light.ts
index fb6b70c00477f993b1c69cd94b78c854c963cce3..76097886d478a0f5f98fbd564fa9b4637647129f 100644
--- a/packages/env/src/index.edge-light.ts
+++ b/packages/env/src/index.edge-light.ts
@@ -6,6 +6,7 @@
 import "./global-check.js";
 export * from "./node-polyfill.js";
 
+export { consoleLogger, emptyLogger, type Logger } from "./logger/index.js";
 export {
   loadTransformers,
   setTransformers,
diff --git a/packages/env/src/index.ts b/packages/env/src/index.ts
index 3f784c42b8b4b7a746a589ce99361b52528fb123..40d8ccf7c6e096773c656416a1f4c5ecda182d8d 100644
--- a/packages/env/src/index.ts
+++ b/packages/env/src/index.ts
@@ -33,6 +33,7 @@ export function createSHA256(): SHA256 {
   };
 }
 
+export { consoleLogger, emptyLogger, type Logger } from "./logger/index.js";
 export {
   loadTransformers,
   setTransformers,
diff --git a/packages/env/src/index.workerd.ts b/packages/env/src/index.workerd.ts
index e688fe1dea88403fe17d303b0d8b4f2403087d44..863d6550d614e6203a25635b3afa3061b111684e 100644
--- a/packages/env/src/index.workerd.ts
+++ b/packages/env/src/index.workerd.ts
@@ -13,6 +13,7 @@ export function getEnv(name: string): string | undefined {
   return INTERNAL_ENV[name];
 }
 
+export { consoleLogger, emptyLogger, type Logger } from "./logger/index.js";
 export {
   loadTransformers,
   setTransformers,
diff --git a/packages/llamaindex/src/internal/logger.ts b/packages/env/src/logger/index.ts
similarity index 85%
rename from packages/llamaindex/src/internal/logger.ts
rename to packages/env/src/logger/index.ts
index 686d7e170f2751c5ef0a022a41e6bd719d3e8de1..12ba69bb35ce1b10214947d9145896dcc148a47a 100644
--- a/packages/llamaindex/src/internal/logger.ts
+++ b/packages/env/src/logger/index.ts
@@ -4,10 +4,12 @@ export type Logger = {
   warn: (...args: unknown[]) => void;
 };
 
+function noop() {}
+
 export const emptyLogger: Logger = Object.freeze({
-  log: () => {},
-  error: () => {},
-  warn: () => {},
+  log: noop,
+  error: noop,
+  warn: noop,
 });
 
 export const consoleLogger: Logger = Object.freeze({
diff --git a/packages/llamaindex/e2e/examples/cloudflare-worker-agent/package.json b/packages/llamaindex/e2e/examples/cloudflare-worker-agent/package.json
index 2936348fbec9902feaf293439f6c74b36d6767a4..dafc52f7481546ebdb167bbd05a7f979a042de4d 100644
--- a/packages/llamaindex/e2e/examples/cloudflare-worker-agent/package.json
+++ b/packages/llamaindex/e2e/examples/cloudflare-worker-agent/package.json
@@ -12,13 +12,13 @@
     "cf-typegen": "wrangler types"
   },
   "devDependencies": {
-    "@cloudflare/vitest-pool-workers": "^0.4.27",
-    "@cloudflare/workers-types": "^4.20240821.1",
-    "@vitest/runner": "1.5.3",
-    "@vitest/snapshot": "1.5.3",
+    "@cloudflare/vitest-pool-workers": "^0.5.8",
+    "@cloudflare/workers-types": "^4.20240924.0",
+    "@vitest/runner": "2.1.1",
+    "@vitest/snapshot": "2.1.1",
     "typescript": "^5.6.2",
-    "vitest": "1.5.3",
-    "wrangler": "^3.73.0"
+    "vitest": "2.1.1",
+    "wrangler": "^3.78.8"
   },
   "dependencies": {
     "llamaindex": "workspace:*"
diff --git a/packages/llamaindex/e2e/examples/cloudflare-worker-agent/src/index.ts b/packages/llamaindex/e2e/examples/cloudflare-worker-agent/src/index.ts
index 8a283cc6bb1d734470426ba84d9c39cdc79c618d..dd4f4d93928d827b67e28c1e1f57e52b759297dc 100644
--- a/packages/llamaindex/e2e/examples/cloudflare-worker-agent/src/index.ts
+++ b/packages/llamaindex/e2e/examples/cloudflare-worker-agent/src/index.ts
@@ -1,21 +1,26 @@
+// add `OPENAI_API_KEY` to the `.dev.vars` file
+interface Env {
+  OPENAI_API_KEY: string;
+}
+
 export default {
   async fetch(
     request: Request,
     env: Env,
     ctx: ExecutionContext,
   ): Promise<Response> {
-    const { setEnvs } = await import("@llamaindex/env");
-    setEnvs(env);
-    const { OpenAIAgent } = await import("llamaindex");
+    const { OpenAIAgent, OpenAI } = await import("@llamaindex/openai");
+    const text = await request.text();
     const agent = new OpenAIAgent({
+      llm: new OpenAI({
+        apiKey: env.OPENAI_API_KEY,
+      }),
       tools: [],
     });
-    console.log(1);
     const responseStream = await agent.chat({
       stream: true,
-      message: "Hello? What is the weather today?",
+      message: text,
     });
-    console.log(2);
     const textEncoder = new TextEncoder();
     const response = responseStream.pipeThrough<Uint8Array>(
       new TransformStream({
diff --git a/packages/llamaindex/e2e/examples/cloudflare-worker-agent/test/index.spec.ts b/packages/llamaindex/e2e/examples/cloudflare-worker-agent/test/index.spec.ts
index d78091e783281ff891fe9c7b9376ec1a5a027d2d..247f77c9292fcccced2233c9b0b3b839b03e6d84 100644
--- a/packages/llamaindex/e2e/examples/cloudflare-worker-agent/test/index.spec.ts
+++ b/packages/llamaindex/e2e/examples/cloudflare-worker-agent/test/index.spec.ts
@@ -14,7 +14,11 @@ describe("Hello World worker", () => {
     const request = new IncomingRequest("http://example.com");
     // Create an empty context to pass to `worker.fetch()`.
     const ctx = createExecutionContext();
-    const response = await worker.fetch(request, env, ctx);
+    const response = await worker.fetch(
+      request,
+      { ...env, OPENAI_API_KEY: "sk-1234" },
+      ctx,
+    );
     // Wait for all `Promise`s passed to `ctx.waitUntil()` to settle before running test assertions
     await waitOnExecutionContext(ctx);
     // fixme: should be not "Hello World!"
diff --git a/packages/llamaindex/e2e/fixtures/llm/openai.ts b/packages/llamaindex/e2e/fixtures/llm/openai.ts
index 10fd90c6453dc9ccd5dbe84ba932923bf2e4ddaf..6e21c879483bf5312916c79376c908cbdb4b66b8 100644
--- a/packages/llamaindex/e2e/fixtures/llm/openai.ts
+++ b/packages/llamaindex/e2e/fixtures/llm/openai.ts
@@ -21,6 +21,8 @@ import {
   type MessageContentDetail,
 } from "llamaindex";
 
+export { OpenAIAgent, OpenAIAgentWorker } from "@llamaindex/openai";
+
 export function getOpenAISession() {
   return {};
 }
diff --git a/packages/llamaindex/e2e/mock-module.js b/packages/llamaindex/e2e/mock-module.js
index fe6cd62629c8c21d1f601df8d0ec295db16a44f2..28f55f3aa6994635a3bad033496e09f83f203085 100644
--- a/packages/llamaindex/e2e/mock-module.js
+++ b/packages/llamaindex/e2e/mock-module.js
@@ -35,6 +35,10 @@ export async function resolve(specifier, context, nextResolve) {
   if (!exist) {
     return result;
   }
+  if (context.parentURL.includes("e2e/fixtures")) {
+    // ignore the fixture import itself
+    return result;
+  }
   return {
     url,
     format: "module",
diff --git a/packages/llamaindex/src/Settings.ts b/packages/llamaindex/src/Settings.ts
index 4eae4745cc81d11b8706fbce5cfe0b9d89734e61..b522a6a81d4dddf5c90aa2941468d4ab3d46c763 100644
--- a/packages/llamaindex/src/Settings.ts
+++ b/packages/llamaindex/src/Settings.ts
@@ -13,7 +13,7 @@ import {
   SentenceSplitter,
 } from "@llamaindex/core/node-parser";
 import type { LoadTransformerEvent } from "@llamaindex/env";
-import { AsyncLocalStorage, getEnv } from "@llamaindex/env";
+import { AsyncLocalStorage } from "@llamaindex/env";
 import type { ServiceContext } from "./ServiceContext.js";
 import {
   getEmbeddedModel,
@@ -57,12 +57,7 @@ class GlobalSettings implements Config {
   #promptAsyncLocalStorage = new AsyncLocalStorage<PromptConfig>();
 
   get debug() {
-    const debug = getEnv("DEBUG");
-    return (
-      (Boolean(debug) && debug?.includes("llamaindex")) ||
-      debug === "*" ||
-      debug === "true"
-    );
+    return CoreSettings.debug;
   }
 
   get llm(): LLM {
diff --git a/packages/llamaindex/src/agent/anthropic.ts b/packages/llamaindex/src/agent/anthropic.ts
index 45d7c5ce31e754ad0ea220f09eb345e3d96a7a34..86463fff1405f54e667264c07e785fd87ba7cce7 100644
--- a/packages/llamaindex/src/agent/anthropic.ts
+++ b/packages/llamaindex/src/agent/anthropic.ts
@@ -1,3 +1,8 @@
+import {
+  LLMAgent,
+  LLMAgentWorker,
+  type LLMAgentParams,
+} from "@llamaindex/core/agent";
 import type {
   NonStreamingChatEngineParams,
   StreamingChatEngineParams,
@@ -5,7 +10,6 @@ import type {
 import type { EngineResponse } from "@llamaindex/core/schema";
 import { Settings } from "../Settings.js";
 import { Anthropic } from "../llm/anthropic.js";
-import { LLMAgent, LLMAgentWorker, type LLMAgentParams } from "./llm.js";
 
 export type AnthropicAgentParams = LLMAgentParams;
 
diff --git a/packages/llamaindex/src/agent/index.ts b/packages/llamaindex/src/agent/index.ts
index feda11bd400296f0130f8b934215373b7cd5c639..3473f0c5f1d42b285b60552b902b05e9b3f58694 100644
--- a/packages/llamaindex/src/agent/index.ts
+++ b/packages/llamaindex/src/agent/index.ts
@@ -1,22 +1,19 @@
+export * from "@llamaindex/core/agent";
+export {
+  OpenAIAgent,
+  OpenAIAgentWorker,
+  type OpenAIAgentParams,
+} from "@llamaindex/openai";
 export {
   AnthropicAgent,
   AnthropicAgentWorker,
   type AnthropicAgentParams,
 } from "./anthropic.js";
-export { AgentRunner, AgentWorker, type AgentParamsBase } from "./base.js";
-export { LLMAgent, LLMAgentWorker, type LLMAgentParams } from "./llm.js";
-export {
-  OpenAIAgent,
-  OpenAIAgentWorker,
-  type OpenAIAgentParams,
-} from "./openai.js";
 export {
   ReACTAgentWorker,
   ReActAgent,
   type ReACTAgentParams,
 } from "./react.js";
-export { type TaskHandler } from "./types.js";
-export { callTool, stepTools, stepToolsStreaming } from "./utils.js";
 
 // todo: ParallelAgent
 // todo: CustomAgent
diff --git a/packages/llamaindex/src/agent/react.ts b/packages/llamaindex/src/agent/react.ts
index cec254f89117e2e9b11d84168fdfe1ab46bfe6d3..7cc01f2627f0c9bebce8df0484ad20220ff4374f 100644
--- a/packages/llamaindex/src/agent/react.ts
+++ b/packages/llamaindex/src/agent/react.ts
@@ -1,3 +1,13 @@
+import {
+  type AgentParamsBase,
+  AgentRunner,
+  AgentWorker,
+  callTool,
+  consumeAsyncIterable,
+  createReadableStream,
+  type TaskHandler,
+  validateAgentParams,
+} from "@llamaindex/core/agent";
 import type { JSONObject, JSONValue } from "@llamaindex/core/global";
 import type {
   BaseTool,
@@ -6,22 +16,14 @@ import type {
   ChatResponseChunk,
   LLM,
 } from "@llamaindex/core/llms";
-import { extractText } from "@llamaindex/core/utils";
-import { randomUUID } from "@llamaindex/env";
-import { getReACTAgentSystemHeader } from "../internal/prompt/react.js";
 import {
-  isAsyncIterable,
+  extractText,
   stringifyJSONToMessageContent,
-} from "../internal/utils.js";
+} from "@llamaindex/core/utils";
+import { randomUUID } from "@llamaindex/env";
+import { getReACTAgentSystemHeader } from "../internal/prompt/react.js";
+import { isAsyncIterable } from "../internal/utils.js";
 import { Settings } from "../Settings.js";
-import { AgentRunner, AgentWorker, type AgentParamsBase } from "./base.js";
-import type { TaskHandler } from "./types.js";
-import {
-  callTool,
-  consumeAsyncIterable,
-  createReadableStream,
-  validateAgentParams,
-} from "./utils.js";
 
 export type ReACTAgentParams = AgentParamsBase<LLM>;
 
diff --git a/packages/llamaindex/src/index.edge.ts b/packages/llamaindex/src/index.edge.ts
index a2b81943026a6bfa13d7cd741708ddacd8e99ae7..20f92029919e15eb2982951ae8f5e854c76d470c 100644
--- a/packages/llamaindex/src/index.edge.ts
+++ b/packages/llamaindex/src/index.edge.ts
@@ -1,5 +1,4 @@
-import type { AgentEndEvent, AgentStartEvent } from "./agent/types.js";
-
+export * from "@llamaindex/core/agent";
 export * from "@llamaindex/core/chat-engine";
 export {
   CallbackManager,
@@ -29,26 +28,16 @@ export type {
   LLMStreamEvent,
   LLMToolCallEvent,
   LLMToolResultEvent,
+  LlamaIndexEventMaps,
 } from "@llamaindex/core/global";
 export * from "@llamaindex/core/indices";
 export * from "@llamaindex/core/llms";
+export * from "@llamaindex/core/memory";
 export * from "@llamaindex/core/prompts";
 export * from "@llamaindex/core/query-engine";
 export * from "@llamaindex/core/response-synthesizers";
 export * from "@llamaindex/core/retriever";
 export * from "@llamaindex/core/schema";
-
-declare module "@llamaindex/core/global" {
-  export interface LlamaIndexEventMaps {
-    // agent events
-    "agent-start": AgentStartEvent;
-    "agent-end": AgentEndEvent;
-  }
-}
-
-export * from "@llamaindex/core/llms";
-export * from "@llamaindex/core/memory";
-export * from "@llamaindex/core/schema";
 export * from "./agent/index.js";
 export * from "./cloud/index.js";
 export * from "./embeddings/index.js";
diff --git a/packages/llamaindex/src/internal/utils.ts b/packages/llamaindex/src/internal/utils.ts
index 1e18c474fe1b8e89ba332dde86024c21e21add06..53e5b975526b21ddcaf1281374b37ae7b3f9ea56 100644
--- a/packages/llamaindex/src/internal/utils.ts
+++ b/packages/llamaindex/src/internal/utils.ts
@@ -1,5 +1,4 @@
 import { similarity } from "@llamaindex/core/embeddings";
-import type { JSONValue } from "@llamaindex/core/global";
 import type { ImageType } from "@llamaindex/core/schema";
 import { fs } from "@llamaindex/env";
 import { filetypemime } from "magic-bytes.js";
@@ -18,21 +17,6 @@ export const isIterable = (obj: unknown): obj is Iterable<unknown> => {
   return obj != null && typeof obj === "object" && Symbol.iterator in obj;
 };
 
-/**
- * Prettify an error for AI to read
- */
-export function prettifyError(error: unknown): string {
-  if (error instanceof Error) {
-    return `Error(${error.name}): ${error.message}`;
-  } else {
-    return `${error}`;
-  }
-}
-
-export function stringifyJSONToMessageContent(value: JSONValue): string {
-  return JSON.stringify(value, null, 2).replace(/"([^"]*)"/g, "$1");
-}
-
 /**
  * Get the top K embeddings from a list of embeddings ordered by similarity to the query.
  * @param queryEmbedding
diff --git a/packages/llamaindex/src/objects/base.ts b/packages/llamaindex/src/objects/base.ts
index eb7cb0083d392b2006341625a741e567ba2a0dfa..688346834a0bab9ae7515673d33c0faf4a6c9fca 100644
--- a/packages/llamaindex/src/objects/base.ts
+++ b/packages/llamaindex/src/objects/base.ts
@@ -1,81 +1,12 @@
-import type { BaseTool, MessageContent } from "@llamaindex/core/llms";
-import { BaseRetriever } from "@llamaindex/core/retriever";
+import type { BaseTool } from "@llamaindex/core/llms";
+import {
+  BaseObjectNodeMapping,
+  ObjectRetriever,
+} from "@llamaindex/core/objects";
 import type { BaseNode, Metadata } from "@llamaindex/core/schema";
 import { TextNode } from "@llamaindex/core/schema";
-import { extractText } from "@llamaindex/core/utils";
 import type { VectorStoreIndex } from "../indices/vectorStore/index.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
-
-export abstract class BaseObjectNodeMapping {
-  // TypeScript doesn't support Python's classmethod directly, but we can use static methods as an alternative
-  abstract fromObjects<OT>(objs: OT[], ...args: any[]): BaseObjectNodeMapping;
-
-  // Abstract methods in TypeScript
-  abstract objNodeMapping(): Record<any, any>;
-  abstract toNode(obj: any): TextNode;
-
-  // Concrete methods can be defined as usual
-  validateObject(obj: any): void {}
-
-  // Implementing the add object logic
-  addObj(obj: any): void {
-    this.validateObject(obj);
-    this._addObj(obj);
-  }
-
-  // Abstract method for internal add object logic
-  abstract _addObj(obj: any): void;
-
-  // Implementing toNodes method
-  toNodes(objs: any[]): TextNode[] {
-    return objs.map((obj) => this.toNode(obj));
-  }
-
-  // Abstract method for internal from node logic
-  abstract _fromNode(node: BaseNode): any;
-
-  // Implementing fromNode method
-  fromNode(node: BaseNode): any {
-    const obj = this._fromNode(node);
-    this.validateObject(obj);
-    return obj;
-  }
-
-  // Abstract methods for persistence
-  abstract persist(persistDir: string, objNodeMappingFilename: string): void;
-}
-
-// You will need to implement specific subclasses of BaseObjectNodeMapping as per your project requirements.
-
-export class ObjectRetriever<T = unknown> {
-  _retriever: BaseRetriever;
-  _objectNodeMapping: BaseObjectNodeMapping;
-
-  constructor(
-    retriever: BaseRetriever,
-    objectNodeMapping: BaseObjectNodeMapping,
-  ) {
-    this._retriever = retriever;
-    this._objectNodeMapping = objectNodeMapping;
-  }
-
-  // In TypeScript, getters are defined like this.
-  get retriever(): BaseRetriever {
-    return this._retriever;
-  }
-
-  // Translating the retrieve method
-  async retrieve(strOrQueryBundle: MessageContent): Promise<T[]> {
-    const nodes = await this.retriever.retrieve({
-      query: extractText(strOrQueryBundle),
-    });
-    const objs = nodes.map((n) => this._objectNodeMapping.fromNode(n.node));
-    return objs;
-  }
-}
-
 const convertToolToNode = (tool: BaseTool): TextNode => {
   const nodeText = `
     Tool name: ${tool.metadata.name}
diff --git a/packages/llamaindex/src/readers/JSONReader.ts b/packages/llamaindex/src/readers/JSONReader.ts
index b1894e2a23d9cf21fc9cf8221c359651cae9cf0f..6c5cff4bc5fc4fb27785895ae7bc2d279ca1fb58 100644
--- a/packages/llamaindex/src/readers/JSONReader.ts
+++ b/packages/llamaindex/src/readers/JSONReader.ts
@@ -1,7 +1,7 @@
 import { parseChunked } from "@discoveryjs/json-ext";
 import type { JSONValue } from "@llamaindex/core/global";
 import { Document, FileReader } from "@llamaindex/core/schema";
-import { type Logger, consoleLogger } from "../internal/logger.js";
+import { consoleLogger, type Logger } from "@llamaindex/env";
 
 // Possible improvements:
 // - use `json-ext` for streaming JSON.stringify. Currently once JSON.stringify is called, the data is already chunked, so there should be no high risk of memory issues
diff --git a/packages/llamaindex/src/agent/openai.ts b/packages/llm/openai/src/agent.ts
similarity index 72%
rename from packages/llamaindex/src/agent/openai.ts
rename to packages/llm/openai/src/agent.ts
index 8cd84bc675ff3972df36eec3b91d6fa158686f31..36c6ad66c7f057d93fb3524e7cd7b0a727e44de2 100644
--- a/packages/llamaindex/src/agent/openai.ts
+++ b/packages/llm/openai/src/agent.ts
@@ -1,6 +1,10 @@
-import { OpenAI } from "@llamaindex/openai";
-import { Settings } from "../Settings.js";
-import { LLMAgent, LLMAgentWorker, type LLMAgentParams } from "./llm.js";
+import {
+  LLMAgent,
+  LLMAgentWorker,
+  type LLMAgentParams,
+} from "@llamaindex/core/agent";
+import { Settings } from "@llamaindex/core/global";
+import { OpenAI } from "./llm";
 
 // This is likely not necessary anymore but leaving it here just incase it's in use elsewhere
 
diff --git a/packages/llm/openai/src/index.ts b/packages/llm/openai/src/index.ts
index f1e663639c19225d50f1142545b3ac92f75488bf..b74136de4fb26a3465fa9db8ae4b652fb560260b 100644
--- a/packages/llm/openai/src/index.ts
+++ b/packages/llm/openai/src/index.ts
@@ -1,3 +1,8 @@
+export {
+  OpenAIAgent,
+  OpenAIAgentWorker,
+  type OpenAIAgentParams,
+} from "./agent";
 export { ALL_OPENAI_EMBEDDING_MODELS, OpenAIEmbedding } from "./embedding";
 export {
   ALL_AVAILABLE_OPENAI_MODELS,
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e3d2abce4fadcdf35abc4a0ee9443708cbec7165..2fb4f982c53eb23612ddf85350c48af307966898 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -709,26 +709,26 @@ importers:
         version: link:../../..
     devDependencies:
       '@cloudflare/vitest-pool-workers':
-        specifier: ^0.4.27
-        version: 0.4.27(@cloudflare/workers-types@4.20240821.1)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.5.3(@edge-runtime/vm@4.0.3)(@types/node@22.5.5)(happy-dom@15.7.4)(terser@5.32.0))
+        specifier: ^0.5.8
+        version: 0.5.8(@cloudflare/workers-types@4.20240924.0)(@vitest/runner@2.1.1)(@vitest/snapshot@2.1.1)(vitest@2.1.1(@edge-runtime/vm@4.0.3)(@types/node@22.5.5)(happy-dom@15.7.4)(msw@2.4.8(typescript@5.6.2))(terser@5.32.0))
       '@cloudflare/workers-types':
-        specifier: ^4.20240821.1
-        version: 4.20240821.1
+        specifier: ^4.20240924.0
+        version: 4.20240924.0
       '@vitest/runner':
-        specifier: 1.5.3
-        version: 1.5.3
+        specifier: 2.1.1
+        version: 2.1.1
       '@vitest/snapshot':
-        specifier: 1.5.3
-        version: 1.5.3
+        specifier: 2.1.1
+        version: 2.1.1
       typescript:
         specifier: ^5.6.2
         version: 5.6.2
       vitest:
-        specifier: 1.5.3
-        version: 1.5.3(@edge-runtime/vm@4.0.3)(@types/node@22.5.5)(happy-dom@15.7.4)(terser@5.32.0)
+        specifier: 2.1.1
+        version: 2.1.1(@edge-runtime/vm@4.0.3)(@types/node@22.5.5)(happy-dom@15.7.4)(msw@2.4.8(typescript@5.6.2))(terser@5.32.0)
       wrangler:
-        specifier: ^3.73.0
-        version: 3.73.0(@cloudflare/workers-types@4.20240821.1)
+        specifier: ^3.78.8
+        version: 3.78.8(@cloudflare/workers-types@4.20240924.0)
 
   packages/llamaindex/e2e/examples/llama-parse-browser:
     dependencies:
@@ -2276,49 +2276,49 @@ packages:
     resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==}
     engines: {node: '>=16.13'}
 
-  '@cloudflare/vitest-pool-workers@0.4.27':
-    resolution: {integrity: sha512-C56YNcHrLhTsES3kiY4xcCr4knq/dQX6jfVyXVFdKX1I1LHb43MsIm3OWCm9/RK/liHm1RpQD5Km+YZq/C7tyQ==}
+  '@cloudflare/vitest-pool-workers@0.5.8':
+    resolution: {integrity: sha512-YRN3uZRkZmpC2I6I56Jg+5Q+5aijOBxZxAQrUE9xO1+FjV9BNqHO/4LLdldj7ZqSV+LB2pzRCMhViHcnPCF91g==}
     peerDependencies:
-      '@vitest/runner': 1.3.x - 1.5.x
-      '@vitest/snapshot': 1.3.x - 1.5.x
-      vitest: 1.3.x - 1.5.x
+      '@vitest/runner': 2.0.x - 2.1.x
+      '@vitest/snapshot': 2.0.x - 2.1.x
+      vitest: 2.0.x - 2.1.x
 
-  '@cloudflare/workerd-darwin-64@1.20240821.1':
-    resolution: {integrity: sha512-CDBpfZKrSy4YrIdqS84z67r3Tzal2pOhjCsIb63IuCnvVes59/ft1qhczBzk9EffeOE2iTCrA4YBT7Sbn7USew==}
+  '@cloudflare/workerd-darwin-64@1.20240909.0':
+    resolution: {integrity: sha512-nJ8jm/6PR8DPzVb4QifNAfSdrFZXNblwIdOhLTU5FpSvFFocmzFX5WgzQagvtmcC9/ZAQyxuf7WynDNyBcoe0Q==}
     engines: {node: '>=16'}
     cpu: [x64]
     os: [darwin]
 
-  '@cloudflare/workerd-darwin-arm64@1.20240821.1':
-    resolution: {integrity: sha512-Q+9RedvNbPcEt/dKni1oN94OxbvuNAeJkgHmrLFTGF8zu21wzOhVkQeRNxcYxrMa9mfStc457NAg13OVCj2kHQ==}
+  '@cloudflare/workerd-darwin-arm64@1.20240909.0':
+    resolution: {integrity: sha512-gJqKa811oSsoxy9xuoQn7bS0Hr1sY+o3EUORTcEnulG6Kz9NQ6nd8QNdp2Hrk2jmmSqwrNkn+a6PZkWzk6Q0Gw==}
     engines: {node: '>=16'}
     cpu: [arm64]
     os: [darwin]
 
-  '@cloudflare/workerd-linux-64@1.20240821.1':
-    resolution: {integrity: sha512-j6z3KsPtawrscoLuP985LbqFrmsJL6q1mvSXOXTqXGODAHIzGBipHARdOjms3UQqovzvqB2lQaQsZtLBwCZxtA==}
+  '@cloudflare/workerd-linux-64@1.20240909.0':
+    resolution: {integrity: sha512-sJrmtccfMg73sZljiBpe4R+lhF58TqzqhF2pQG8HRjyxkzkM1sjpZqfEFaIkNUDqd3/Ibji49fklhPCGXljKSg==}
     engines: {node: '>=16'}
     cpu: [x64]
     os: [linux]
 
-  '@cloudflare/workerd-linux-arm64@1.20240821.1':
-    resolution: {integrity: sha512-I9bHgZOxJQW0CV5gTdilyxzTG7ILzbTirehQWgfPx9X77E/7eIbR9sboOMgyeC69W4he0SKtpx0sYZuTJu4ERw==}
+  '@cloudflare/workerd-linux-arm64@1.20240909.0':
+    resolution: {integrity: sha512-dTbSdceyRXPOSER+18AwYRbPQG0e/Dwl2trmfMMCETkfJhNLv1fU3FFMJPjfILijKnhTZHSnHCx0+xwHdon2fg==}
     engines: {node: '>=16'}
     cpu: [arm64]
     os: [linux]
 
-  '@cloudflare/workerd-windows-64@1.20240821.1':
-    resolution: {integrity: sha512-keC97QPArs6LWbPejQM7/Y8Jy8QqyaZow4/ZdsGo+QjlOLiZRDpAenfZx3CBUoWwEeFwQTl2FLO+8hV1SWFFYw==}
+  '@cloudflare/workerd-windows-64@1.20240909.0':
+    resolution: {integrity: sha512-/d4BT0kcWFa7Qc0K4K9+cwVQ1qyPNKiO42JZUijlDlco+TYTPkLO3qGEohmwbfMq+BieK7JTMSgjO81ZHpA0HQ==}
     engines: {node: '>=16'}
     cpu: [x64]
     os: [win32]
 
-  '@cloudflare/workers-shared@0.4.1':
-    resolution: {integrity: sha512-nYh4r8JwOOjYIdH2zub++CmIKlkYFlpxI1nBHimoiHcytJXD/b7ldJ21TtfzUZMCgI78mxVlymMHA/ReaOxKlA==}
+  '@cloudflare/workers-shared@0.5.4':
+    resolution: {integrity: sha512-PNL/0TjKRdUHa1kwgVdqUNJVZ9ez4kacsi8omz+gv859EvJmsVuGiMAClY2YfJnC9LVKhKCcjqmFgKNXG9/IXA==}
     engines: {node: '>=16.7.0'}
 
-  '@cloudflare/workers-types@4.20240821.1':
-    resolution: {integrity: sha512-icAkbnAqgVl6ef9lgLTom8na+kj2RBw2ViPAQ586hbdj0xZcnrjK7P46Eu08OU9D/lNDgN2sKU/sxhe2iK/gIg==}
+  '@cloudflare/workers-types@4.20240924.0':
+    resolution: {integrity: sha512-AnoHY0B5rgMv4Lg34mdwfp4+Z9ZZRli8AFO7uY8Q9UchR+HPEMEdaAQ0EswTYQqcVBdarRuYyM0Oeo4hM8Jqog==}
 
   '@colors/colors@1.5.0':
     resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
@@ -4784,9 +4784,6 @@ packages:
     peerDependencies:
       vite: ^4.2.0 || ^5.0.0
 
-  '@vitest/expect@1.5.3':
-    resolution: {integrity: sha512-y+waPz31pOFr3rD7vWTbwiLe5+MgsMm40jTZbQE8p8/qXyBX3CQsIXRx9XK12IbY7q/t5a5aM/ckt33b4PxK2g==}
-
   '@vitest/expect@2.1.1':
     resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==}
 
@@ -4805,27 +4802,15 @@ packages:
   '@vitest/pretty-format@2.1.1':
     resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==}
 
-  '@vitest/runner@1.5.3':
-    resolution: {integrity: sha512-7PlfuReN8692IKQIdCxwir1AOaP5THfNkp0Uc4BKr2na+9lALNit7ub9l3/R7MP8aV61+mHKRGiqEKRIwu6iiQ==}
-
   '@vitest/runner@2.1.1':
     resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==}
 
-  '@vitest/snapshot@1.5.3':
-    resolution: {integrity: sha512-K3mvIsjyKYBhNIDujMD2gfQEzddLe51nNOAf45yKRt/QFJcUIeTQd2trRvv6M6oCBHNVnZwFWbQ4yj96ibiDsA==}
-
   '@vitest/snapshot@2.1.1':
     resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==}
 
-  '@vitest/spy@1.5.3':
-    resolution: {integrity: sha512-Llj7Jgs6lbnL55WoshJUUacdJfjU2honvGcAJBxhra5TPEzTJH8ZuhI3p/JwqqfnTr4PmP7nDmOXP53MS7GJlg==}
-
   '@vitest/spy@2.1.1':
     resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==}
 
-  '@vitest/utils@1.5.3':
-    resolution: {integrity: sha512-rE9DTN1BRhzkzqNQO+kw8ZgfeEBCLXiHJwetk668shmNBpSagQxneT5eSqEBLP+cqSiAeecvQmbpFfdMyLcIQA==}
-
   '@vitest/utils@2.1.1':
     resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==}
 
@@ -5078,10 +5063,6 @@ packages:
     resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
     engines: {node: '>=8'}
 
-  ansi-styles@5.2.0:
-    resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
-    engines: {node: '>=10'}
-
   ansi-styles@6.2.1:
     resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
     engines: {node: '>=12'}
@@ -5178,9 +5159,6 @@ packages:
     engines: {node: '>=16', npm: '>=7'}
     hasBin: true
 
-  assertion-error@1.1.0:
-    resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
-
   assertion-error@2.0.1:
     resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
     engines: {node: '>=12'}
@@ -5487,10 +5465,6 @@ packages:
   ccount@2.0.1:
     resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
 
-  chai@4.5.0:
-    resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==}
-    engines: {node: '>=4'}
-
   chai@5.1.1:
     resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==}
     engines: {node: '>=12'}
@@ -5535,9 +5509,6 @@ packages:
   chardet@0.7.0:
     resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
 
-  check-error@1.0.3:
-    resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
-
   check-error@2.1.1:
     resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
     engines: {node: '>= 16'}
@@ -6045,10 +6016,6 @@ packages:
     resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
     engines: {node: '>=10'}
 
-  deep-eql@4.1.4:
-    resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==}
-    engines: {node: '>=6'}
-
   deep-eql@5.0.2:
     resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
     engines: {node: '>=6'}
@@ -6205,10 +6172,6 @@ packages:
   diff-match-patch@1.0.5:
     resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==}
 
-  diff-sequences@29.6.3:
-    resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
   dingbat-to-unicode@1.0.1:
     resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==}
 
@@ -7858,9 +7821,6 @@ packages:
   js-tokens@4.0.0:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
 
-  js-tokens@9.0.0:
-    resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==}
-
   js-yaml@3.14.1:
     resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
     hasBin: true
@@ -8034,10 +7994,6 @@ packages:
     resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==}
     engines: {node: '>= 12.13.0'}
 
-  local-pkg@0.5.0:
-    resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
-    engines: {node: '>=14'}
-
   locate-character@3.0.0:
     resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
 
@@ -8134,9 +8090,6 @@ packages:
   lop@0.4.1:
     resolution: {integrity: sha512-9xyho9why2A2tzm5aIcMWKvzqKsnxrf9B5I+8O30olh6lQU8PH978LqZoI4++37RBgS1Em5i54v1TFs/3wnmXQ==}
 
-  loupe@2.3.7:
-    resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
-
   loupe@3.1.1:
     resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==}
 
@@ -8504,8 +8457,8 @@ packages:
     peerDependencies:
       webpack: ^5.0.0
 
-  miniflare@3.20240821.0:
-    resolution: {integrity: sha512-4BhLGpssQxM/O6TZmJ10GkT3wBJK6emFkZ3V87/HyvQmVt8zMxEBvyw5uv6kdtp+7F54Nw6IKFJjPUL8rFVQrQ==}
+  miniflare@3.20240909.5:
+    resolution: {integrity: sha512-3Am3D9LGDljEKWnylSy6hFg3LFnNCo9DlWqZFcL7QkuIhQwN6Sqz1d6xQCkgft7FVXnykG6VNpz0NrjdW+mBjg==}
     engines: {node: '>=16.13'}
     hasBin: true
 
@@ -8907,6 +8860,9 @@ packages:
   ohash@1.1.3:
     resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==}
 
+  ohash@1.1.4:
+    resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==}
+
   ollama@0.5.9:
     resolution: {integrity: sha512-F/KZuDRC+ZsVCuMvcOYuQ6zj42/idzCkkuknGyyGVmNStMZ/sU3jQpvhnl4SyC0+zBzLiKNZJnJeuPFuieWZvQ==}
 
@@ -9027,10 +8983,6 @@ packages:
     resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
 
-  p-limit@5.0.0:
-    resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==}
-    engines: {node: '>=18'}
-
   p-locate@3.0.0:
     resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
     engines: {node: '>=6'}
@@ -9164,9 +9116,6 @@ packages:
   path-to-regexp@2.2.1:
     resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==}
 
-  path-to-regexp@6.2.2:
-    resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==}
-
   path-to-regexp@6.3.0:
     resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
 
@@ -9177,9 +9126,6 @@ packages:
   pathe@1.1.2:
     resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
 
-  pathval@1.1.1:
-    resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
-
   pathval@2.0.0:
     resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
     engines: {node: '>= 14.16'}
@@ -9665,10 +9611,6 @@ packages:
   pretty-error@4.0.0:
     resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==}
 
-  pretty-format@29.7.0:
-    resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
   pretty-ms@7.0.1:
     resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==}
     engines: {node: '>=10'}
@@ -9872,9 +9814,6 @@ packages:
   react-is@16.13.1:
     resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
 
-  react-is@18.3.1:
-    resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
-
   react-json-view-lite@1.4.0:
     resolution: {integrity: sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA==}
     engines: {node: '>=14'}
@@ -10655,9 +10594,6 @@ packages:
     resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
     engines: {node: '>=8'}
 
-  strip-literal@2.1.0:
-    resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==}
-
   strip-outer@2.0.0:
     resolution: {integrity: sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -10857,10 +10793,6 @@ packages:
   tinyexec@0.3.0:
     resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==}
 
-  tinypool@0.8.4:
-    resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==}
-    engines: {node: '>=14.0.0'}
-
   tinypool@1.0.1:
     resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==}
     engines: {node: ^18.0.0 || >=20.0.0}
@@ -10869,10 +10801,6 @@ packages:
     resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
     engines: {node: '>=14.0.0'}
 
-  tinyspy@2.2.1:
-    resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==}
-    engines: {node: '>=14.0.0'}
-
   tinyspy@3.0.0:
     resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==}
     engines: {node: '>=14.0.0'}
@@ -11012,10 +10940,6 @@ packages:
     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
     engines: {node: '>= 0.8.0'}
 
-  type-detect@4.1.0:
-    resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==}
-    engines: {node: '>=4'}
-
   type-fest@0.20.2:
     resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
     engines: {node: '>=10'}
@@ -11114,8 +11038,8 @@ packages:
     resolution: {integrity: sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==}
     engines: {node: '>=18.0'}
 
-  unenv-nightly@2.0.0-1724863496.70db6f1:
-    resolution: {integrity: sha512-r+VIl1gnsI4WQxluruSQhy8alpAf1AsLRLm4sEKp3otCyTIVD6I6wHEYzeQnwsyWgaD4+3BD4A/eqrgOpdTzhw==}
+  unenv-nightly@2.0.0-20240919-125358-9a64854:
+    resolution: {integrity: sha512-XjsgUTrTHR7iw+k/SRTNjh6EQgwpC9voygnoCJo5kh4hKqsSDHUW84MhL9EsHTNfLctvVBHaSw8e2k3R2fKXsQ==}
 
   unicode-canonical-property-names-ecmascript@2.0.0:
     resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
@@ -11265,11 +11189,6 @@ packages:
   vfile@6.0.3:
     resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
 
-  vite-node@1.5.3:
-    resolution: {integrity: sha512-axFo00qiCpU/JLd8N1gu9iEYL3xTbMbMrbe5nDp9GL0nb6gurIdZLkkFogZXWnE8Oyy5kfSLwNVIcVsnhE7lgQ==}
-    engines: {node: ^18.0.0 || >=20.0.0}
-    hasBin: true
-
   vite-node@2.1.1:
     resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==}
     engines: {node: ^18.0.0 || >=20.0.0}
@@ -11311,31 +11230,6 @@ packages:
       terser:
         optional: true
 
-  vitest@1.5.3:
-    resolution: {integrity: sha512-2oM7nLXylw3mQlW6GXnRriw+7YvZFk/YNV8AxIC3Z3MfFbuziLGWP9GPxxu/7nRlXhqyxBikpamr+lEEj1sUEw==}
-    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.5.3
-      '@vitest/ui': 1.5.3
-      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
-
   vitest@2.1.1:
     resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==}
     engines: {node: ^18.0.0 || >=20.0.0}
@@ -11556,17 +11450,17 @@ packages:
   wordwrap@1.0.0:
     resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
 
-  workerd@1.20240821.1:
-    resolution: {integrity: sha512-y4phjCnEG96u8ZkgkkHB+gSw0i6uMNo23rBmixylWpjxDklB+LWD8dztasvsu7xGaZbLoTxQESdEw956F7VJDA==}
+  workerd@1.20240909.0:
+    resolution: {integrity: sha512-NwuYh/Fgr/MK0H+Ht687sHl/f8tumwT5CWzYR0MZMHri8m3CIYu2IaY4tBFWoKE/tOU1Z5XjEXECa9zXY4+lwg==}
     engines: {node: '>=16'}
     hasBin: true
 
-  wrangler@3.73.0:
-    resolution: {integrity: sha512-VrdDR2OpvsCQp+r5Of3rDP1W64cNN/LHLVx1roULOlPS8PZiv7rUYgkwhdCQ61+HICAaeSxWYIzkL5+B9+8W3g==}
+  wrangler@3.78.8:
+    resolution: {integrity: sha512-tnJ++KY0EeQKa7Pm5Zxl1Cnf1QcmlLit2CohCpTEFHSgCzwzwViuxFL8JQvVKj8Qb65ouBNbfPZnlqrEyGpbew==}
     engines: {node: '>=16.17.0'}
     hasBin: true
     peerDependencies:
-      '@cloudflare/workers-types': ^4.20240821.1
+      '@cloudflare/workers-types': ^4.20240909.0
     peerDependenciesMeta:
       '@cloudflare/workers-types':
         optional: true
@@ -14472,18 +14366,18 @@ snapshots:
     dependencies:
       mime: 3.0.0
 
-  '@cloudflare/vitest-pool-workers@0.4.27(@cloudflare/workers-types@4.20240821.1)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.5.3(@edge-runtime/vm@4.0.3)(@types/node@22.5.5)(happy-dom@15.7.4)(terser@5.32.0))':
+  '@cloudflare/vitest-pool-workers@0.5.8(@cloudflare/workers-types@4.20240924.0)(@vitest/runner@2.1.1)(@vitest/snapshot@2.1.1)(vitest@2.1.1(@edge-runtime/vm@4.0.3)(@types/node@22.5.5)(happy-dom@15.7.4)(msw@2.4.8(typescript@5.6.2))(terser@5.32.0))':
     dependencies:
-      '@vitest/runner': 1.5.3
-      '@vitest/snapshot': 1.5.3
+      '@vitest/runner': 2.1.1
+      '@vitest/snapshot': 2.1.1
       birpc: 0.2.14
       cjs-module-lexer: 1.4.0
       devalue: 4.3.3
       esbuild: 0.17.19
-      miniflare: 3.20240821.0
+      miniflare: 3.20240909.5
       semver: 7.6.3
-      vitest: 1.5.3(@edge-runtime/vm@4.0.3)(@types/node@22.5.5)(happy-dom@15.7.4)(terser@5.32.0)
-      wrangler: 3.73.0(@cloudflare/workers-types@4.20240821.1)
+      vitest: 2.1.1(@edge-runtime/vm@4.0.3)(@types/node@22.5.5)(happy-dom@15.7.4)(msw@2.4.8(typescript@5.6.2))(terser@5.32.0)
+      wrangler: 3.78.8(@cloudflare/workers-types@4.20240924.0)
       zod: 3.23.8
     transitivePeerDependencies:
       - '@cloudflare/workers-types'
@@ -14491,24 +14385,27 @@ snapshots:
       - supports-color
       - utf-8-validate
 
-  '@cloudflare/workerd-darwin-64@1.20240821.1':
+  '@cloudflare/workerd-darwin-64@1.20240909.0':
     optional: true
 
-  '@cloudflare/workerd-darwin-arm64@1.20240821.1':
+  '@cloudflare/workerd-darwin-arm64@1.20240909.0':
     optional: true
 
-  '@cloudflare/workerd-linux-64@1.20240821.1':
+  '@cloudflare/workerd-linux-64@1.20240909.0':
     optional: true
 
-  '@cloudflare/workerd-linux-arm64@1.20240821.1':
+  '@cloudflare/workerd-linux-arm64@1.20240909.0':
     optional: true
 
-  '@cloudflare/workerd-windows-64@1.20240821.1':
+  '@cloudflare/workerd-windows-64@1.20240909.0':
     optional: true
 
-  '@cloudflare/workers-shared@0.4.1': {}
+  '@cloudflare/workers-shared@0.5.4':
+    dependencies:
+      mime: 3.0.0
+      zod: 3.23.8
 
-  '@cloudflare/workers-types@4.20240821.1': {}
+  '@cloudflare/workers-types@4.20240924.0': {}
 
   '@colors/colors@1.5.0':
     optional: true
@@ -17551,12 +17448,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@vitest/expect@1.5.3':
-    dependencies:
-      '@vitest/spy': 1.5.3
-      '@vitest/utils': 1.5.3
-      chai: 4.5.0
-
   '@vitest/expect@2.1.1':
     dependencies:
       '@vitest/spy': 2.1.1
@@ -17586,44 +17477,21 @@ snapshots:
     dependencies:
       tinyrainbow: 1.2.0
 
-  '@vitest/runner@1.5.3':
-    dependencies:
-      '@vitest/utils': 1.5.3
-      p-limit: 5.0.0
-      pathe: 1.1.2
-
   '@vitest/runner@2.1.1':
     dependencies:
       '@vitest/utils': 2.1.1
       pathe: 1.1.2
 
-  '@vitest/snapshot@1.5.3':
-    dependencies:
-      magic-string: 0.30.11
-      pathe: 1.1.2
-      pretty-format: 29.7.0
-
   '@vitest/snapshot@2.1.1':
     dependencies:
       '@vitest/pretty-format': 2.1.1
       magic-string: 0.30.11
       pathe: 1.1.2
 
-  '@vitest/spy@1.5.3':
-    dependencies:
-      tinyspy: 2.2.1
-
   '@vitest/spy@2.1.1':
     dependencies:
       tinyspy: 3.0.0
 
-  '@vitest/utils@1.5.3':
-    dependencies:
-      diff-sequences: 29.6.3
-      estree-walker: 3.0.3
-      loupe: 2.3.7
-      pretty-format: 29.7.0
-
   '@vitest/utils@2.1.1':
     dependencies:
       '@vitest/pretty-format': 2.1.1
@@ -17953,8 +17821,6 @@ snapshots:
     dependencies:
       color-convert: 2.0.1
 
-  ansi-styles@5.2.0: {}
-
   ansi-styles@6.2.1: {}
 
   any-promise@1.3.0: {}
@@ -18080,8 +17946,6 @@ snapshots:
       binaryen: 116.0.0-nightly.20240114
       long: 5.2.3
 
-  assertion-error@1.1.0: {}
-
   assertion-error@2.0.1: {}
 
   ast-module-types@6.0.0: {}
@@ -18463,16 +18327,6 @@ snapshots:
 
   ccount@2.0.1: {}
 
-  chai@4.5.0:
-    dependencies:
-      assertion-error: 1.1.0
-      check-error: 1.0.3
-      deep-eql: 4.1.4
-      get-func-name: 2.0.2
-      loupe: 2.3.7
-      pathval: 1.1.1
-      type-detect: 4.1.0
-
   chai@5.1.1:
     dependencies:
       assertion-error: 2.0.1
@@ -18512,10 +18366,6 @@ snapshots:
 
   chardet@0.7.0: {}
 
-  check-error@1.0.3:
-    dependencies:
-      get-func-name: 2.0.2
-
   check-error@2.1.1: {}
 
   cheerio-select@2.1.0:
@@ -19079,10 +18929,6 @@ snapshots:
     dependencies:
       mimic-response: 3.1.0
 
-  deep-eql@4.1.4:
-    dependencies:
-      type-detect: 4.1.0
-
   deep-eql@5.0.2: {}
 
   deep-equal@2.2.3:
@@ -19258,8 +19104,6 @@ snapshots:
 
   diff-match-patch@1.0.5: {}
 
-  diff-sequences@29.6.3: {}
-
   dingbat-to-unicode@1.0.1: {}
 
   dir-glob@3.0.1:
@@ -21393,8 +21237,6 @@ snapshots:
 
   js-tokens@4.0.0: {}
 
-  js-tokens@9.0.0: {}
-
   js-yaml@3.14.1:
     dependencies:
       argparse: 1.0.10
@@ -21599,11 +21441,6 @@ snapshots:
 
   loader-utils@3.3.1: {}
 
-  local-pkg@0.5.0:
-    dependencies:
-      mlly: 1.7.1
-      pkg-types: 1.2.0
-
   locate-character@3.0.0: {}
 
   locate-path@3.0.0:
@@ -21696,10 +21533,6 @@ snapshots:
       option: 0.2.4
       underscore: 1.13.6
 
-  loupe@2.3.7:
-    dependencies:
-      get-func-name: 2.0.2
-
   loupe@3.1.1:
     dependencies:
       get-func-name: 2.0.2
@@ -22349,7 +22182,7 @@ snapshots:
       tapable: 2.2.1
       webpack: 5.94.0
 
-  miniflare@3.20240821.0:
+  miniflare@3.20240909.5:
     dependencies:
       '@cspotcode/source-map-support': 0.8.1
       acorn: 8.12.1
@@ -22359,7 +22192,7 @@ snapshots:
       glob-to-regexp: 0.4.1
       stoppable: 1.1.0
       undici: 5.28.4
-      workerd: 1.20240821.1
+      workerd: 1.20240909.0
       ws: 8.18.0
       youch: 3.3.3
       zod: 3.23.8
@@ -22820,6 +22653,8 @@ snapshots:
 
   ohash@1.1.3: {}
 
+  ohash@1.1.4: {}
+
   ollama@0.5.9:
     dependencies:
       whatwg-fetch: 3.6.20
@@ -22987,10 +22822,6 @@ snapshots:
     dependencies:
       yocto-queue: 1.1.1
 
-  p-limit@5.0.0:
-    dependencies:
-      yocto-queue: 1.1.1
-
   p-locate@3.0.0:
     dependencies:
       p-limit: 2.3.0
@@ -23125,16 +22956,12 @@ snapshots:
 
   path-to-regexp@2.2.1: {}
 
-  path-to-regexp@6.2.2: {}
-
   path-to-regexp@6.3.0: {}
 
   path-type@4.0.0: {}
 
   pathe@1.1.2: {}
 
-  pathval@1.1.1: {}
-
   pathval@2.0.0: {}
 
   peek-readable@5.1.1: {}
@@ -23591,12 +23418,6 @@ snapshots:
       lodash: 4.17.21
       renderkid: 3.0.0
 
-  pretty-format@29.7.0:
-    dependencies:
-      '@jest/schemas': 29.6.3
-      ansi-styles: 5.2.0
-      react-is: 18.3.1
-
   pretty-ms@7.0.1:
     dependencies:
       parse-ms: 2.1.0
@@ -23832,8 +23653,6 @@ snapshots:
 
   react-is@16.13.1: {}
 
-  react-is@18.3.1: {}
-
   react-json-view-lite@1.4.0(react@18.3.1):
     dependencies:
       react: 18.3.1
@@ -24822,10 +24641,6 @@ snapshots:
 
   strip-json-comments@3.1.1: {}
 
-  strip-literal@2.1.0:
-    dependencies:
-      js-tokens: 9.0.0
-
   strip-outer@2.0.0: {}
 
   strnum@1.0.5: {}
@@ -25067,14 +24882,10 @@ snapshots:
 
   tinyexec@0.3.0: {}
 
-  tinypool@0.8.4: {}
-
   tinypool@1.0.1: {}
 
   tinyrainbow@1.2.0: {}
 
-  tinyspy@2.2.1: {}
-
   tinyspy@3.0.0: {}
 
   tmp@0.0.33:
@@ -25201,8 +25012,6 @@ snapshots:
     dependencies:
       prelude-ls: 1.2.1
 
-  type-detect@4.1.0: {}
-
   type-fest@0.20.2: {}
 
   type-fest@0.21.3: {}
@@ -25301,10 +25110,10 @@ snapshots:
 
   undici@6.13.0: {}
 
-  unenv-nightly@2.0.0-1724863496.70db6f1:
+  unenv-nightly@2.0.0-20240919-125358-9a64854:
     dependencies:
       defu: 6.1.4
-      ohash: 1.1.3
+      ohash: 1.1.4
       pathe: 1.1.2
       ufo: 1.5.4
 
@@ -25468,24 +25277,6 @@ snapshots:
       '@types/unist': 3.0.3
       vfile-message: 4.0.2
 
-  vite-node@1.5.3(@types/node@22.5.5)(terser@5.32.0):
-    dependencies:
-      cac: 6.7.14
-      debug: 4.3.7
-      pathe: 1.1.2
-      picocolors: 1.1.0
-      vite: 5.4.2(@types/node@22.5.5)(terser@5.32.0)
-    transitivePeerDependencies:
-      - '@types/node'
-      - less
-      - lightningcss
-      - sass
-      - sass-embedded
-      - stylus
-      - sugarss
-      - supports-color
-      - terser
-
   vite-node@2.1.1(@types/node@22.5.4)(terser@5.32.0):
     dependencies:
       cac: 6.7.14
@@ -25544,42 +25335,6 @@ snapshots:
       fsevents: 2.3.3
       terser: 5.32.0
 
-  vitest@1.5.3(@edge-runtime/vm@4.0.3)(@types/node@22.5.5)(happy-dom@15.7.4)(terser@5.32.0):
-    dependencies:
-      '@vitest/expect': 1.5.3
-      '@vitest/runner': 1.5.3
-      '@vitest/snapshot': 1.5.3
-      '@vitest/spy': 1.5.3
-      '@vitest/utils': 1.5.3
-      acorn-walk: 8.3.3
-      chai: 4.5.0
-      debug: 4.3.7
-      execa: 8.0.1
-      local-pkg: 0.5.0
-      magic-string: 0.30.11
-      pathe: 1.1.2
-      picocolors: 1.1.0
-      std-env: 3.7.0
-      strip-literal: 2.1.0
-      tinybench: 2.9.0
-      tinypool: 0.8.4
-      vite: 5.4.2(@types/node@22.5.5)(terser@5.32.0)
-      vite-node: 1.5.3(@types/node@22.5.5)(terser@5.32.0)
-      why-is-node-running: 2.3.0
-    optionalDependencies:
-      '@edge-runtime/vm': 4.0.3
-      '@types/node': 22.5.5
-      happy-dom: 15.7.4
-    transitivePeerDependencies:
-      - less
-      - lightningcss
-      - sass
-      - sass-embedded
-      - stylus
-      - sugarss
-      - supports-color
-      - terser
-
   vitest@2.1.1(@edge-runtime/vm@4.0.3)(@types/node@22.5.4)(happy-dom@15.7.4)(msw@2.4.8(typescript@5.6.2))(terser@5.32.0):
     dependencies:
       '@vitest/expect': 2.1.1
@@ -25993,36 +25748,36 @@ snapshots:
 
   wordwrap@1.0.0: {}
 
-  workerd@1.20240821.1:
+  workerd@1.20240909.0:
     optionalDependencies:
-      '@cloudflare/workerd-darwin-64': 1.20240821.1
-      '@cloudflare/workerd-darwin-arm64': 1.20240821.1
-      '@cloudflare/workerd-linux-64': 1.20240821.1
-      '@cloudflare/workerd-linux-arm64': 1.20240821.1
-      '@cloudflare/workerd-windows-64': 1.20240821.1
+      '@cloudflare/workerd-darwin-64': 1.20240909.0
+      '@cloudflare/workerd-darwin-arm64': 1.20240909.0
+      '@cloudflare/workerd-linux-64': 1.20240909.0
+      '@cloudflare/workerd-linux-arm64': 1.20240909.0
+      '@cloudflare/workerd-windows-64': 1.20240909.0
 
-  wrangler@3.73.0(@cloudflare/workers-types@4.20240821.1):
+  wrangler@3.78.8(@cloudflare/workers-types@4.20240924.0):
     dependencies:
       '@cloudflare/kv-asset-handler': 0.3.4
-      '@cloudflare/workers-shared': 0.4.1
+      '@cloudflare/workers-shared': 0.5.4
       '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19)
       '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19)
       blake3-wasm: 2.1.5
       chokidar: 3.6.0
       date-fns: 3.6.0
       esbuild: 0.17.19
-      miniflare: 3.20240821.0
+      miniflare: 3.20240909.5
       nanoid: 3.3.7
-      path-to-regexp: 6.2.2
+      path-to-regexp: 6.3.0
       resolve: 1.22.8
       resolve.exports: 2.0.2
       selfsigned: 2.4.1
       source-map: 0.6.1
-      unenv: unenv-nightly@2.0.0-1724863496.70db6f1
-      workerd: 1.20240821.1
+      unenv: unenv-nightly@2.0.0-20240919-125358-9a64854
+      workerd: 1.20240909.0
       xxhash-wasm: 1.0.2
     optionalDependencies:
-      '@cloudflare/workers-types': 4.20240821.1
+      '@cloudflare/workers-types': 4.20240924.0
       fsevents: 2.3.3
     transitivePeerDependencies:
       - bufferutil