@mcp-ts/sdk 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/adapters/agui-adapter.d.mts +2 -2
  2. package/dist/adapters/agui-adapter.d.ts +2 -2
  3. package/dist/adapters/agui-middleware.d.mts +2 -2
  4. package/dist/adapters/agui-middleware.d.ts +2 -2
  5. package/dist/adapters/ai-adapter.d.mts +2 -2
  6. package/dist/adapters/ai-adapter.d.ts +2 -2
  7. package/dist/adapters/langchain-adapter.d.mts +2 -2
  8. package/dist/adapters/langchain-adapter.d.ts +2 -2
  9. package/dist/client/index.d.mts +2 -2
  10. package/dist/client/index.d.ts +2 -2
  11. package/dist/client/react.d.mts +4 -4
  12. package/dist/client/react.d.ts +4 -4
  13. package/dist/client/react.js +96 -44
  14. package/dist/client/react.js.map +1 -1
  15. package/dist/client/react.mjs +96 -44
  16. package/dist/client/react.mjs.map +1 -1
  17. package/dist/client/vue.d.mts +4 -4
  18. package/dist/client/vue.d.ts +4 -4
  19. package/dist/{index-GfC_eNEv.d.ts → index-DhA-OEAe.d.ts} +1 -1
  20. package/dist/{index-DcYfpY3H.d.mts → index-bFL4ZF2N.d.mts} +1 -1
  21. package/dist/index.d.mts +3 -3
  22. package/dist/index.d.ts +3 -3
  23. package/dist/index.js +12 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/index.mjs +12 -2
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/server/index.d.mts +2 -2
  28. package/dist/server/index.d.ts +2 -2
  29. package/dist/server/index.js +12 -2
  30. package/dist/server/index.js.map +1 -1
  31. package/dist/server/index.mjs +12 -2
  32. package/dist/server/index.mjs.map +1 -1
  33. package/dist/shared/index.d.mts +4 -4
  34. package/dist/shared/index.d.ts +4 -4
  35. package/dist/shared/index.js.map +1 -1
  36. package/dist/shared/index.mjs.map +1 -1
  37. package/dist/{tool-router-_O2tIwf7.d.mts → tool-router-BVaV1udm.d.mts} +1 -1
  38. package/dist/{tool-router-Bn9R0KWr.d.ts → tool-router-Dh2804tM.d.ts} +1 -1
  39. package/dist/{types-CfCoIsWI.d.mts → types-rIuN1CQi.d.mts} +1 -0
  40. package/dist/{types-CfCoIsWI.d.ts → types-rIuN1CQi.d.ts} +1 -0
  41. package/package.json +1 -1
  42. package/src/client/react/oauth-popup.tsx +111 -51
  43. package/src/server/handlers/sse-handler.ts +12 -0
  44. package/src/server/mcp/oauth-client.ts +6 -2
  45. package/src/shared/types.ts +1 -0
@@ -1,10 +1,10 @@
1
1
  import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CQsRbxYI.mjs';
2
- import { e as ToolRouter } from '../tool-router-_O2tIwf7.mjs';
2
+ import { e as ToolRouter } from '../tool-router-BVaV1udm.mjs';
3
3
  import '../events-CK3N--3g.mjs';
4
4
  import '@modelcontextprotocol/sdk/types.js';
5
5
  import '@modelcontextprotocol/sdk/client/auth.js';
6
6
  import '@modelcontextprotocol/sdk/shared/auth.js';
7
- import '../types-CfCoIsWI.mjs';
7
+ import '../types-rIuN1CQi.mjs';
8
8
 
9
9
  /**
10
10
  * MCP Adapter for AG-UI Integration
@@ -1,10 +1,10 @@
1
1
  import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CHE8QpVE.js';
2
- import { e as ToolRouter } from '../tool-router-Bn9R0KWr.js';
2
+ import { e as ToolRouter } from '../tool-router-Dh2804tM.js';
3
3
  import '../events-CK3N--3g.js';
4
4
  import '@modelcontextprotocol/sdk/types.js';
5
5
  import '@modelcontextprotocol/sdk/client/auth.js';
6
6
  import '@modelcontextprotocol/sdk/shared/auth.js';
7
- import '../types-CfCoIsWI.js';
7
+ import '../types-rIuN1CQi.js';
8
8
 
9
9
  /**
10
10
  * MCP Adapter for AG-UI Integration
@@ -7,8 +7,8 @@ import '../events-CK3N--3g.mjs';
7
7
  import '@modelcontextprotocol/sdk/types.js';
8
8
  import '@modelcontextprotocol/sdk/client/auth.js';
9
9
  import '@modelcontextprotocol/sdk/shared/auth.js';
10
- import '../tool-router-_O2tIwf7.mjs';
11
- import '../types-CfCoIsWI.mjs';
10
+ import '../tool-router-BVaV1udm.mjs';
11
+ import '../types-rIuN1CQi.mjs';
12
12
 
13
13
  /**
14
14
  * AG-UI Middleware for MCP Tool Execution
@@ -7,8 +7,8 @@ import '../events-CK3N--3g.js';
7
7
  import '@modelcontextprotocol/sdk/types.js';
8
8
  import '@modelcontextprotocol/sdk/client/auth.js';
9
9
  import '@modelcontextprotocol/sdk/shared/auth.js';
10
- import '../tool-router-Bn9R0KWr.js';
11
- import '../types-CfCoIsWI.js';
10
+ import '../tool-router-Dh2804tM.js';
11
+ import '../types-rIuN1CQi.js';
12
12
 
13
13
  /**
14
14
  * AG-UI Middleware for MCP Tool Execution
@@ -1,11 +1,11 @@
1
1
  import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CQsRbxYI.mjs';
2
2
  import { ToolSet } from 'ai';
3
- import { e as ToolRouter } from '../tool-router-_O2tIwf7.mjs';
3
+ import { e as ToolRouter } from '../tool-router-BVaV1udm.mjs';
4
4
  import '../events-CK3N--3g.mjs';
5
5
  import '@modelcontextprotocol/sdk/types.js';
6
6
  import '@modelcontextprotocol/sdk/client/auth.js';
7
7
  import '@modelcontextprotocol/sdk/shared/auth.js';
8
- import '../types-CfCoIsWI.mjs';
8
+ import '../types-rIuN1CQi.mjs';
9
9
 
10
10
  interface AIAdapterOptions {
11
11
  /**
@@ -1,11 +1,11 @@
1
1
  import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CHE8QpVE.js';
2
2
  import { ToolSet } from 'ai';
3
- import { e as ToolRouter } from '../tool-router-Bn9R0KWr.js';
3
+ import { e as ToolRouter } from '../tool-router-Dh2804tM.js';
4
4
  import '../events-CK3N--3g.js';
5
5
  import '@modelcontextprotocol/sdk/types.js';
6
6
  import '@modelcontextprotocol/sdk/client/auth.js';
7
7
  import '@modelcontextprotocol/sdk/shared/auth.js';
8
- import '../types-CfCoIsWI.js';
8
+ import '../types-rIuN1CQi.js';
9
9
 
10
10
  interface AIAdapterOptions {
11
11
  /**
@@ -1,11 +1,11 @@
1
1
  import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CQsRbxYI.mjs';
2
2
  import { StructuredTool } from '@langchain/core/tools';
3
- import { e as ToolRouter } from '../tool-router-_O2tIwf7.mjs';
3
+ import { e as ToolRouter } from '../tool-router-BVaV1udm.mjs';
4
4
  import '../events-CK3N--3g.mjs';
5
5
  import '@modelcontextprotocol/sdk/types.js';
6
6
  import '@modelcontextprotocol/sdk/client/auth.js';
7
7
  import '@modelcontextprotocol/sdk/shared/auth.js';
8
- import '../types-CfCoIsWI.mjs';
8
+ import '../types-rIuN1CQi.mjs';
9
9
 
10
10
  interface LangChainAdapterOptions {
11
11
  /**
@@ -1,11 +1,11 @@
1
1
  import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CHE8QpVE.js';
2
2
  import { StructuredTool } from '@langchain/core/tools';
3
- import { e as ToolRouter } from '../tool-router-Bn9R0KWr.js';
3
+ import { e as ToolRouter } from '../tool-router-Dh2804tM.js';
4
4
  import '../events-CK3N--3g.js';
5
5
  import '@modelcontextprotocol/sdk/types.js';
6
6
  import '@modelcontextprotocol/sdk/client/auth.js';
7
7
  import '@modelcontextprotocol/sdk/shared/auth.js';
8
- import '../types-CfCoIsWI.js';
8
+ import '../types-rIuN1CQi.js';
9
9
 
10
10
  interface LangChainAdapterOptions {
11
11
  /**
@@ -1,5 +1,5 @@
1
- export { A as APP_HOST_DEFAULTS, a as AppHost, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, c as SSEClient, d as SSEClientOptions } from '../index-DcYfpY3H.mjs';
1
+ export { A as APP_HOST_DEFAULTS, a as AppHost, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, c as SSEClient, d as SSEClientOptions } from '../index-bFL4ZF2N.mjs';
2
2
  export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, M as McpConnectionEvent, c as McpConnectionState, d as McpObservabilityEvent } from '../events-CK3N--3g.mjs';
3
- export { p as McpRpcRequest, q as McpRpcResponse, v as ToolInfo } from '../types-CfCoIsWI.mjs';
3
+ export { p as McpRpcRequest, q as McpRpcResponse, v as ToolInfo } from '../types-rIuN1CQi.mjs';
4
4
  import '@modelcontextprotocol/ext-apps/app-bridge';
5
5
  import '@modelcontextprotocol/sdk/types.js';
@@ -1,5 +1,5 @@
1
- export { A as APP_HOST_DEFAULTS, a as AppHost, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, c as SSEClient, d as SSEClientOptions } from '../index-GfC_eNEv.js';
1
+ export { A as APP_HOST_DEFAULTS, a as AppHost, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, c as SSEClient, d as SSEClientOptions } from '../index-DhA-OEAe.js';
2
2
  export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, M as McpConnectionEvent, c as McpConnectionState, d as McpObservabilityEvent } from '../events-CK3N--3g.js';
3
- export { p as McpRpcRequest, q as McpRpcResponse, v as ToolInfo } from '../types-CfCoIsWI.js';
3
+ export { p as McpRpcRequest, q as McpRpcResponse, v as ToolInfo } from '../types-rIuN1CQi.js';
4
4
  import '@modelcontextprotocol/ext-apps/app-bridge';
5
5
  import '@modelcontextprotocol/sdk/types.js';
@@ -1,9 +1,9 @@
1
- import { c as SSEClient, e as AppHostOptions, f as AppHostClient, a as AppHost } from '../index-DcYfpY3H.mjs';
2
- export { A as APP_HOST_DEFAULTS, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, d as SSEClientOptions } from '../index-DcYfpY3H.mjs';
1
+ import { c as SSEClient, e as AppHostOptions, f as AppHostClient, a as AppHost } from '../index-bFL4ZF2N.mjs';
2
+ export { A as APP_HOST_DEFAULTS, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, d as SSEClientOptions } from '../index-bFL4ZF2N.mjs';
3
3
  import { c as McpConnectionState, M as McpConnectionEvent } from '../events-CK3N--3g.mjs';
4
4
  export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, d as McpObservabilityEvent } from '../events-CK3N--3g.mjs';
5
- import { v as ToolInfo, k as FinishAuthResult, n as ListToolsRpcResult, L as ListPromptsResult, l as ListResourcesResult } from '../types-CfCoIsWI.mjs';
6
- export { p as McpRpcRequest, q as McpRpcResponse } from '../types-CfCoIsWI.mjs';
5
+ import { v as ToolInfo, k as FinishAuthResult, n as ListToolsRpcResult, L as ListPromptsResult, l as ListResourcesResult } from '../types-rIuN1CQi.mjs';
6
+ export { p as McpRpcRequest, q as McpRpcResponse } from '../types-rIuN1CQi.mjs';
7
7
  import React$1, { ReactNode, CSSProperties } from 'react';
8
8
  import '@modelcontextprotocol/ext-apps/app-bridge';
9
9
  import '@modelcontextprotocol/sdk/types.js';
@@ -1,9 +1,9 @@
1
- import { c as SSEClient, e as AppHostOptions, f as AppHostClient, a as AppHost } from '../index-GfC_eNEv.js';
2
- export { A as APP_HOST_DEFAULTS, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, d as SSEClientOptions } from '../index-GfC_eNEv.js';
1
+ import { c as SSEClient, e as AppHostOptions, f as AppHostClient, a as AppHost } from '../index-DhA-OEAe.js';
2
+ export { A as APP_HOST_DEFAULTS, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, d as SSEClientOptions } from '../index-DhA-OEAe.js';
3
3
  import { c as McpConnectionState, M as McpConnectionEvent } from '../events-CK3N--3g.js';
4
4
  export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, d as McpObservabilityEvent } from '../events-CK3N--3g.js';
5
- import { v as ToolInfo, k as FinishAuthResult, n as ListToolsRpcResult, L as ListPromptsResult, l as ListResourcesResult } from '../types-CfCoIsWI.js';
6
- export { p as McpRpcRequest, q as McpRpcResponse } from '../types-CfCoIsWI.js';
5
+ import { v as ToolInfo, k as FinishAuthResult, n as ListToolsRpcResult, L as ListPromptsResult, l as ListResourcesResult } from '../types-rIuN1CQi.js';
6
+ export { p as McpRpcRequest, q as McpRpcResponse } from '../types-rIuN1CQi.js';
7
7
  import React$1, { ReactNode, CSSProperties } from 'react';
8
8
  import '@modelcontextprotocol/ext-apps/app-bridge';
9
9
  import '@modelcontextprotocol/sdk/types.js';
@@ -627,14 +627,31 @@ function useMcp(options) {
627
627
  }
628
628
  var AUTH_CODE_MESSAGE = "MCP_AUTH_CODE";
629
629
  var AUTH_RESULT_MESSAGE = "MCP_AUTH_RESULT";
630
+ var AUTH_CHANNEL_NAME = "mcp-auth-channel";
631
+ function createAuthBroadcastChannel() {
632
+ if (typeof BroadcastChannel === "undefined") {
633
+ return null;
634
+ }
635
+ try {
636
+ return new BroadcastChannel(AUTH_CHANNEL_NAME);
637
+ } catch {
638
+ return null;
639
+ }
640
+ }
630
641
  function postPopupResult(popupWindow, result) {
631
- popupWindow?.postMessage(
632
- {
633
- type: AUTH_RESULT_MESSAGE,
634
- ...result
635
- },
636
- window.location.origin
637
- );
642
+ const payload = {
643
+ type: AUTH_RESULT_MESSAGE,
644
+ ...result
645
+ };
646
+ try {
647
+ popupWindow?.postMessage(payload, window.location.origin);
648
+ } catch {
649
+ }
650
+ const channel = createAuthBroadcastChannel();
651
+ if (channel) {
652
+ channel.postMessage(payload);
653
+ channel.close();
654
+ }
638
655
  }
639
656
  function openCenteredPopup(url, options = {}) {
640
657
  const {
@@ -675,60 +692,87 @@ function createOAuthPopupRedirectHandler(options = {}) {
675
692
  }
676
693
  function useMcpOAuthPopup(connections, finishAuth) {
677
694
  const pendingPopupsRef = react.useRef(/* @__PURE__ */ new Map());
695
+ const processingCodesRef = react.useRef(/* @__PURE__ */ new Set());
678
696
  react.useEffect(() => {
679
697
  const handleMessage = async (event) => {
680
- if (event.origin !== window.location.origin) {
698
+ if (event.origin && event.origin !== window.location.origin) {
681
699
  return;
682
700
  }
683
- if (event.data?.type !== AUTH_CODE_MESSAGE || !event.data.code) {
701
+ const code = typeof event.data?.code === "string" ? event.data.code : "";
702
+ if (event.data?.type !== AUTH_CODE_MESSAGE || !code) {
684
703
  return;
685
704
  }
686
705
  const popupWindow = event.source && "postMessage" in event.source ? event.source : null;
687
706
  const targetSessionId = typeof event.data.sessionId === "string" ? event.data.sessionId : "";
707
+ if (popupWindow && targetSessionId) {
708
+ pendingPopupsRef.current.set(targetSessionId, popupWindow);
709
+ }
688
710
  if (!targetSessionId) {
689
- postPopupResult(popupWindow, {
690
- success: false,
691
- error: "Missing OAuth session identifier"
692
- });
711
+ if (popupWindow) {
712
+ postPopupResult(popupWindow, {
713
+ success: false,
714
+ error: "Missing OAuth session identifier"
715
+ });
716
+ }
693
717
  return;
694
718
  }
695
719
  const targetSession = connections.find((connection) => connection.sessionId === targetSessionId);
696
720
  if (!targetSession) {
697
- postPopupResult(popupWindow, {
698
- sessionId: targetSessionId,
699
- success: false,
700
- error: "OAuth session not found in the current client state"
701
- });
721
+ if (popupWindow) {
722
+ postPopupResult(popupWindow, {
723
+ sessionId: targetSessionId,
724
+ success: false,
725
+ error: "OAuth session not found in the current client state"
726
+ });
727
+ }
702
728
  return;
703
729
  }
704
- if (popupWindow) {
705
- pendingPopupsRef.current.set(targetSession.sessionId, popupWindow);
730
+ const codeKey = `${targetSession.sessionId}:${code}`;
731
+ if (processingCodesRef.current.has(codeKey)) {
732
+ return;
706
733
  }
734
+ processingCodesRef.current.add(codeKey);
707
735
  try {
708
- await finishAuth(targetSession.sessionId, event.data.code);
736
+ await finishAuth(targetSession.sessionId, code);
709
737
  } catch (error) {
738
+ processingCodesRef.current.delete(codeKey);
710
739
  pendingPopupsRef.current.delete(targetSession.sessionId);
711
- postPopupResult(popupWindow, {
712
- sessionId: targetSession.sessionId,
713
- success: false,
714
- error: error instanceof Error ? error.message : "Failed to finish auth"
715
- });
740
+ if (popupWindow) {
741
+ postPopupResult(popupWindow, {
742
+ sessionId: targetSession.sessionId,
743
+ success: false,
744
+ error: error instanceof Error ? error.message : "Failed to finish auth"
745
+ });
746
+ }
747
+ }
748
+ };
749
+ const channel = createAuthBroadcastChannel();
750
+ const handleChannelMessage = (event) => {
751
+ if (event.data?.type === AUTH_CODE_MESSAGE) {
752
+ void handleMessage(event);
716
753
  }
717
754
  };
718
755
  window.addEventListener("message", handleMessage);
719
- return () => window.removeEventListener("message", handleMessage);
756
+ channel?.addEventListener("message", handleChannelMessage);
757
+ return () => {
758
+ window.removeEventListener("message", handleMessage);
759
+ channel?.removeEventListener("message", handleChannelMessage);
760
+ channel?.close();
761
+ };
720
762
  }, [connections, finishAuth]);
721
763
  react.useEffect(() => {
722
764
  for (const connection of connections) {
723
- const popupWindow = pendingPopupsRef.current.get(connection.sessionId);
724
- if (!popupWindow) {
725
- continue;
726
- }
727
- if (connection.state === "AUTHENTICATED") {
765
+ const popupWindow = pendingPopupsRef.current.get(connection.sessionId) || null;
766
+ if (connection.state === "AUTHENTICATED" || connection.state === "READY" || connection.state === "CONNECTED") {
728
767
  postPopupResult(popupWindow, {
729
768
  sessionId: connection.sessionId,
730
769
  success: true
731
770
  });
771
+ for (const codeKey of processingCodesRef.current) {
772
+ if (codeKey.startsWith(`${connection.sessionId}:`)) {
773
+ processingCodesRef.current.delete(codeKey);
774
+ }
775
+ }
732
776
  pendingPopupsRef.current.delete(connection.sessionId);
733
777
  continue;
734
778
  }
@@ -738,6 +782,11 @@ function useMcpOAuthPopup(connections, finishAuth) {
738
782
  success: false,
739
783
  error: connection.error || "Failed to complete authorization"
740
784
  });
785
+ for (const codeKey of processingCodesRef.current) {
786
+ if (codeKey.startsWith(`${connection.sessionId}:`)) {
787
+ processingCodesRef.current.delete(codeKey);
788
+ }
789
+ }
741
790
  pendingPopupsRef.current.delete(connection.sessionId);
742
791
  }
743
792
  }
@@ -758,10 +807,9 @@ function McpOAuthCallbackContent({
758
807
  }) {
759
808
  const [phase, setPhase] = react.useState(debugPhase || "loading");
760
809
  const [errorMessage, setErrorMessage] = react.useState("");
761
- const openerMissing = typeof window !== "undefined" ? !window.opener : false;
762
810
  const missingCode = !code;
763
811
  const missingSessionId = !sessionId;
764
- const blockingError = openerMissing ? "Error: No opener window found. This window should be opened from the app." : missingCode ? "Error: No authorization code received." : missingSessionId ? "Error: No OAuth state received." : null;
812
+ const blockingError = missingCode ? "Error: No authorization code received." : missingSessionId ? "Error: No OAuth state received." : null;
765
813
  react.useEffect(() => {
766
814
  if (debugPhase) {
767
815
  setPhase(debugPhase);
@@ -774,8 +822,9 @@ function McpOAuthCallbackContent({
774
822
  return;
775
823
  }
776
824
  let closed = false;
825
+ const channel = createAuthBroadcastChannel();
777
826
  const handleResult = (event) => {
778
- if (event.origin !== window.location.origin) {
827
+ if (event.origin && event.origin !== window.location.origin) {
779
828
  return;
780
829
  }
781
830
  if (event.data?.type !== AUTH_RESULT_MESSAGE) {
@@ -787,6 +836,7 @@ function McpOAuthCallbackContent({
787
836
  if (event.data.success) {
788
837
  setPhase("success");
789
838
  window.removeEventListener("message", handleResult);
839
+ channel?.close();
790
840
  closed = true;
791
841
  window.setTimeout(() => window.close(), 1200);
792
842
  return;
@@ -796,21 +846,23 @@ function McpOAuthCallbackContent({
796
846
  setErrorMessage(message);
797
847
  };
798
848
  window.addEventListener("message", handleResult);
799
- try {
800
- window.opener.postMessage(
801
- { type: AUTH_CODE_MESSAGE, code, sessionId },
802
- window.location.origin
803
- );
804
- } catch (error) {
805
- console.error("Failed to communicate with opener:", error);
806
- window.setTimeout(() => {
849
+ channel?.addEventListener("message", handleResult);
850
+ const payload = { type: AUTH_CODE_MESSAGE, code, sessionId };
851
+ if (window.opener) {
852
+ try {
853
+ window.opener.postMessage(payload, window.location.origin);
854
+ } catch {
807
855
  setPhase("error");
808
856
  setErrorMessage("Error: Could not communicate with main window.");
809
- }, 0);
857
+ }
858
+ }
859
+ if (channel) {
860
+ channel.postMessage(payload);
810
861
  }
811
862
  return () => {
812
863
  if (!closed) {
813
864
  window.removeEventListener("message", handleResult);
865
+ channel?.close();
814
866
  }
815
867
  };
816
868
  }, [blockingError, code, sessionId, debugPhase]);