From b3681bf68196c22753785c3a0d3b64d2d0d90ffa Mon Sep 17 00:00:00 2001
From: Brian Peiris <79419+brianpeiris@users.noreply.github.com>
Date: Sun, 14 Jul 2024 18:24:49 -0400
Subject: [PATCH] fix: DataCloneError when using FunctionTool (#1037)

---
 .changeset/short-plants-sip.md                |  6 +++++
 .../src/global/settings/callback-manager.ts   |  4 +---
 packages/core/tests/event-system.test.ts      | 22 +++++++++++++++++++
 3 files changed, 29 insertions(+), 3 deletions(-)
 create mode 100644 .changeset/short-plants-sip.md

diff --git a/.changeset/short-plants-sip.md b/.changeset/short-plants-sip.md
new file mode 100644
index 000000000..91d2a1f03
--- /dev/null
+++ b/.changeset/short-plants-sip.md
@@ -0,0 +1,6 @@
+---
+"@llamaindex/core": patch
+"llamaindex": patch
+---
+
+fix: DataCloneError when using FunctionTool
diff --git a/packages/core/src/global/settings/callback-manager.ts b/packages/core/src/global/settings/callback-manager.ts
index 53c87db66..e8f6750f7 100644
--- a/packages/core/src/global/settings/callback-manager.ts
+++ b/packages/core/src/global/settings/callback-manager.ts
@@ -105,9 +105,7 @@ export class CallbackManager {
     }
     queueMicrotask(() => {
       cbs.forEach((handler) =>
-        handler(
-          LlamaIndexCustomEvent.fromEvent(event, structuredClone(detail)),
-        ),
+        handler(LlamaIndexCustomEvent.fromEvent(event, { ...detail })),
       );
     });
   }
diff --git a/packages/core/tests/event-system.test.ts b/packages/core/tests/event-system.test.ts
index 657391219..b24f32d95 100644
--- a/packages/core/tests/event-system.test.ts
+++ b/packages/core/tests/event-system.test.ts
@@ -6,6 +6,9 @@ declare module "@llamaindex/core/global" {
     test: {
       value: number;
     };
+    functionTest: {
+      fn: ({ x }: { x: number }) => string;
+    };
   }
 }
 
@@ -42,6 +45,25 @@ describe("event system", () => {
     expect(callback).toHaveBeenCalledTimes(1);
   });
 
+  test("dispatch function tool event", async () => {
+    const testFunction = ({ x }: { x: number }) => `${x * 2}`;
+    let callback;
+    Settings.callbackManager.on(
+      "functionTest",
+      (callback = vi.fn((event) => {
+        const data = event.detail;
+        expect(data.fn).toBe(testFunction);
+      })),
+    );
+
+    Settings.callbackManager.dispatchEvent("functionTest", {
+      fn: testFunction,
+    });
+    expect(callback).toHaveBeenCalledTimes(0);
+    await new Promise((resolve) => process.nextTick(resolve));
+    expect(callback).toHaveBeenCalledTimes(1);
+  });
+
   // rollup doesn't support decorators for now
   // test('wrap event caller', async () => {
   //   class A {
-- 
GitLab