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