@mastra/agent-browser 0.5.2 → 0.5.3-alpha.0

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.
package/dist/index.cjs CHANGED
@@ -770,7 +770,7 @@ var AgentBrowser = class extends _mastra_core_browser.MastraBrowser {
770
770
  this.notifyBrowserReady(session.threadId);
771
771
  },
772
772
  onBrowserCreated: (manager, threadId) => {
773
- this.setupCloseListenerForThread(manager, threadId);
773
+ this.setupCloseListenerForThread(manager, threadId, this.isRemoteThreadBrowser());
774
774
  }
775
775
  };
776
776
  const createTm = config.createThreadManager ?? ((opts) => new AgentBrowserThreadManager(opts));
@@ -825,24 +825,29 @@ var AgentBrowser = class extends _mastra_core_browser.MastraBrowser {
825
825
  if (localConfig.cdpHeaders) launchOptions.cdpHeaders = localConfig.cdpHeaders;
826
826
  await this.sharedManager.launch(launchOptions);
827
827
  this.threadManager.setSharedManager(this.sharedManager);
828
- this.setupCloseListenerForSharedScope(this.sharedManager);
828
+ this.setupCloseListenerForSharedScope(this.sharedManager, Boolean(launchOptions.cdpUrl));
829
829
  }
830
830
  /**
831
831
  * Set up close event listeners for 'shared' scope browser.
832
832
  * This handles the case where the shared browser is closed externally.
833
833
  */
834
- setupCloseListenerForSharedScope(manager) {
834
+ setupCloseListenerForSharedScope(manager, connectedOverCdp = false) {
835
835
  try {
836
- const pidLookup = getBrowserPid(manager).then((pid) => {
837
- if (pid && this.sharedManager === manager) this.sharedBrowserPid = pid;
838
- }).finally(() => this.pidLookups.delete(pidLookup));
839
- this.pidLookups.add(pidLookup);
836
+ let pidLookup;
837
+ if (!connectedOverCdp) {
838
+ pidLookup = getBrowserPid(manager).then((pid) => {
839
+ if (pid && this.sharedManager === manager) this.sharedBrowserPid = pid;
840
+ }).finally(() => {
841
+ if (pidLookup) this.pidLookups.delete(pidLookup);
842
+ });
843
+ this.pidLookups.add(pidLookup);
844
+ }
840
845
  let disconnectHandled = false;
841
846
  const handleDisconnect = () => {
842
847
  if (disconnectHandled) return;
843
848
  disconnectHandled = true;
844
849
  this.rememberClosedBrowserState(manager, "user");
845
- pidLookup.catch(() => void 0).then(() => this.handleBrowserDisconnected());
850
+ Promise.resolve(pidLookup).catch(() => void 0).then(() => this.handleBrowserDisconnected());
846
851
  };
847
852
  const context = manager.getContext();
848
853
  if (context) context.on("close", handleDisconnect);
@@ -956,18 +961,36 @@ var AgentBrowser = class extends _mastra_core_browser.MastraBrowser {
956
961
  * Set up close event listener for a thread's browser manager.
957
962
  * This handles the case where a thread's browser is closed externally.
958
963
  */
959
- setupCloseListenerForThread(manager, threadId) {
964
+ /**
965
+ * Whether per-thread browsers are reached over CDP (a remote/container
966
+ * browser we do not own). When true, their PID is never captured — signalling
967
+ * it locally is meaningless and dangerous (issue #23588).
968
+ *
969
+ * Base AgentBrowser only connects over CDP when a `cdpUrl` is configured
970
+ * (thread scope with `cdpUrl` is normally rejected by config validation, so
971
+ * this is defense in depth). Subclasses that always drive a remote browser
972
+ * per thread (e.g. Firecrawl) override this to return `true`.
973
+ */
974
+ isRemoteThreadBrowser() {
975
+ return Boolean(this.config.cdpUrl);
976
+ }
977
+ setupCloseListenerForThread(manager, threadId, connectedOverCdp = false) {
960
978
  try {
961
- const pidLookup = getBrowserPid(manager).then((pid) => {
962
- if (pid && this.threadManager?.getExistingManagerForThread(threadId) === manager) this.threadBrowserPids.set(threadId, pid);
963
- }).finally(() => this.pidLookups.delete(pidLookup));
964
- this.pidLookups.add(pidLookup);
979
+ let pidLookup;
980
+ if (!connectedOverCdp) {
981
+ pidLookup = getBrowserPid(manager).then((pid) => {
982
+ if (pid && this.threadManager?.getExistingManagerForThread(threadId) === manager) this.threadBrowserPids.set(threadId, pid);
983
+ }).finally(() => {
984
+ if (pidLookup) this.pidLookups.delete(pidLookup);
985
+ });
986
+ this.pidLookups.add(pidLookup);
987
+ }
965
988
  let disconnectHandled = false;
966
989
  const handleDisconnect = () => {
967
990
  if (disconnectHandled) return;
968
991
  disconnectHandled = true;
969
992
  this.rememberClosedBrowserState(manager, "user", threadId);
970
- pidLookup.catch(() => void 0).then(() => this.handleThreadBrowserDisconnected(threadId));
993
+ Promise.resolve(pidLookup).catch(() => void 0).then(() => this.handleThreadBrowserDisconnected(threadId));
971
994
  };
972
995
  const context = manager.getContext();
973
996
  if (context) context.on("close", handleDisconnect);