-
Notifications
You must be signed in to change notification settings - Fork 955
[api] store frame ID map #907
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
🦋 Changeset detectedLatest commit: 78940d4 The changes in this PR will be included in the next version bump. Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Greptile Summary
This PR implements frame ID mapping functionality to enable multi-tab handling for the Stagehand API. The changes introduce a systematic way to track and identify specific browser tabs/frames when executing operations through the API.
The implementation adds a frameId
property to core operation interfaces (ActOptions
, ExtractOptions
, ObserveOptions
, and GotoOptions
), allowing frame identification to be passed throughout the system. A new frame ID mapping system is implemented in StagehandContext
with methods to register, unregister, and lookup pages by frame ID using a Map data structure for O(1) performance.
StagehandPage
now tracks its CDP (Chrome DevTools Protocol) frame ID through automatic retrieval during initialization and exposes it via a public frameId
getter. The page handles frame navigation events to update the mapping when root frames change, and automatically unregisters frame IDs when pages close to prevent memory leaks.
All API method calls (act
, extract
, observe
, goto
) now include the frame ID in their parameters, enabling the remote API to route operations to the correct page. A critical bug fix in lib/api.ts
ensures that when calling extract
without a schema, all options (including frameId
) are properly passed instead of being ignored.
This architecture enables the Stagehand API to maintain session state across multiple tabs and correctly execute operations in complex multi-tab scenarios where pages might be created, destroyed, or navigated independently.
Confidence score: 4/5
• This PR is generally safe to merge with solid implementation but has some minor lifecycle management concerns
• The implementation is well-structured and follows good practices, but lacks automatic cleanup validation and duplicate registration handling
• The lib/api.ts
extract method fix needs attention as it was previously ignoring critical options
5 files reviewed, no comments
14d7645
to
fd74b5a
Compare
fd74b5a
to
2a437b9
Compare
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @browserbasehq/[email protected] ### Patch Changes - [#865](#865) [`6b4e6e3`](6b4e6e3) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - improve type safety for trimTrailingTextNode - [#897](#897) [`e77d018`](e77d018) Thanks [@miguelg719](https://github.com/miguelg719)! - Fix selfHeal to remember intially received arguments - [#920](#920) [`c20adb9`](c20adb9) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - fix: tab handling on API - [#882](#882) [`b86df93`](b86df93) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - remove elements that don't have xpaths from observe response - [#905](#905) [`023c2c2`](023c2c2) Thanks [@tkattkat](https://github.com/tkattkat)! - Delete old images from anthropic cua client - [#925](#925) [`8c28647`](8c28647) Thanks [@miguelg719](https://github.com/miguelg719)! - Remove \_refreshPageFromApi() - [#887](#887) [`87e09c6`](87e09c6) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - fix: allow xpaths with prepended 'xpath=' for targeted extract - [#864](#864) [`a611115`](a611115) Thanks [@miguelg719](https://github.com/miguelg719)! - Temporarily patch custom clients serialization error on api - [#881](#881) [`69913fe`](69913fe) Thanks [@miguelg719](https://github.com/miguelg719)! - Pass sdk version number to API for debugging - [#913](#913) [`b1b83a1`](b1b83a1) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - move iframe out of 'experimental' - [#891](#891) [`be8497c`](be8497c) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - fix: nested iframe xpath bug - [#883](#883) [`98704c9`](98704c9) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - add timeout for JS click - [#907](#907) [`04978bd`](04978bd) Thanks [@seanmcguire12](https://github.com/seanmcguire12)! - store mapping of CDP frame ID -> page ## @browserbasehq/[email protected] ### Patch Changes - Updated dependencies \[[`6b4e6e3`](6b4e6e3), [`e77d018`](e77d018), [`c20adb9`](c20adb9), [`b86df93`](b86df93), [`023c2c2`](023c2c2), [`8c28647`](8c28647), [`87e09c6`](87e09c6), [`a611115`](a611115), [`69913fe`](69913fe), [`b1b83a1`](b1b83a1), [`be8497c`](be8497c), [`98704c9`](98704c9), [`04978bd`](04978bd)]: - @browserbasehq/[email protected] ## @browserbasehq/[email protected] ### Patch Changes - Updated dependencies \[[`6b4e6e3`](6b4e6e3), [`e77d018`](e77d018), [`c20adb9`](c20adb9), [`b86df93`](b86df93), [`023c2c2`](023c2c2), [`8c28647`](8c28647), [`87e09c6`](87e09c6), [`a611115`](a611115), [`69913fe`](69913fe), [`b1b83a1`](b1b83a1), [`be8497c`](be8497c), [`98704c9`](98704c9), [`04978bd`](04978bd)]: - @browserbasehq/[email protected] Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
why
what changed
test plan
act
evalsregression
evalsextract
evalsobserve
evals