diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 911c623..d11c8fc 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "3.19.3" + ".": "3.20.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index ac9e78a..d8428d4 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 8 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-b969ce378479c79ee64c05127c0ed6c6ce2edbee017ecd037242fb618a5ebc9f.yml -openapi_spec_hash: a24aabaa5214effb679808b7f2be0ad4 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browserbase%2Fstagehand-1c6caa2891a7f3bdfc0caab143f285badc9145220c9b29cd5e4cf1a9b3ac11cf.yml +openapi_spec_hash: 28c4b734a5309067c39bb4c4b709b9ab config_hash: a962ae71493deb11a1c903256fb25386 diff --git a/CHANGELOG.md b/CHANGELOG.md index 951b097..5e0efeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## 3.20.0 (2026-04-09) + +Full Changelog: [v3.19.3...v3.20.0](https://github.com/browserbase/stagehand-ruby/compare/v3.19.3...v3.20.0) + +### Features + +* [STG-1798] feat: support Browserbase verified sessions ([9647eb3](https://github.com/browserbase/stagehand-ruby/commit/9647eb3a4df86cc9d7aedb2f0a9ddd0babd39565)) +* Bedrock auth passthrough ([5cb6ecb](https://github.com/browserbase/stagehand-ruby/commit/5cb6ecbe621e894dc6c5aec379fdca1183eec4fc)) +* Revert "[STG-1573] Add providerOptions for extensible model auth ([#1822](https://github.com/browserbase/stagehand-ruby/issues/1822))" ([0c83a09](https://github.com/browserbase/stagehand-ruby/commit/0c83a0978116f8fc11a4edf78586f3d61b8af5e8)) + + +### Bug Fixes + +* multipart encoding for file arrays ([149b303](https://github.com/browserbase/stagehand-ruby/commit/149b303eb54f4c9af037a5e073a2d6c92d959b44)) + ## 3.19.3 (2026-04-03) Full Changelog: [v3.18.0...v3.19.3](https://github.com/browserbase/stagehand-ruby/compare/v3.18.0...v3.19.3) diff --git a/Gemfile.lock b/Gemfile.lock index a02c554..4490644 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -11,7 +11,7 @@ GIT PATH remote: . specs: - stagehand (3.19.3) + stagehand (3.20.0) cgi connection_pool diff --git a/lib/stagehand/internal/util.rb b/lib/stagehand/internal/util.rb index 4e9a51e..3ac0058 100644 --- a/lib/stagehand/internal/util.rb +++ b/lib/stagehand/internal/util.rb @@ -610,6 +610,7 @@ def encode_query_params(query) # # @return [Array(String, Enumerable)] private def encode_multipart_streaming(body) + # rubocop:disable Style/CaseEquality # RFC 1521 Section 7.2.1 says we should have 70 char maximum for boundary length boundary = SecureRandom.urlsafe_base64(46) @@ -619,7 +620,7 @@ def encode_query_params(query) in Hash body.each do |key, val| case val - in Array if val.all? { primitive?(_1) } + in Array if val.all? { primitive?(_1) || Stagehand::Internal::Type::FileInput === _1 } val.each do |v| write_multipart_chunk(y, boundary: boundary, key: key, val: v, closing: closing) end @@ -635,6 +636,7 @@ def encode_query_params(query) fused_io = fused_enum(strio) { closing.each(&:call) } [boundary, fused_io] + # rubocop:enable Style/CaseEquality end # @api private diff --git a/lib/stagehand/models/session_start_params.rb b/lib/stagehand/models/session_start_params.rb index 754ec05..e98f6fa 100644 --- a/lib/stagehand/models/session_start_params.rb +++ b/lib/stagehand/models/session_start_params.rb @@ -401,6 +401,16 @@ class BrowserSettings < Stagehand::Internal::Type::BaseModel # @return [Boolean, nil] optional :block_ads, Stagehand::Internal::Type::Boolean, api_name: :blockAds + # @!attribute captcha_image_selector + # + # @return [String, nil] + optional :captcha_image_selector, String, api_name: :captchaImageSelector + + # @!attribute captcha_input_selector + # + # @return [String, nil] + optional :captcha_input_selector, String, api_name: :captchaInputSelector + # @!attribute context # # @return [Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Context, nil] @@ -423,6 +433,12 @@ class BrowserSettings < Stagehand::Internal::Type::BaseModel # @return [Boolean, nil] optional :log_session, Stagehand::Internal::Type::Boolean, api_name: :logSession + # @!attribute os + # + # @return [Symbol, Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os, nil] + optional :os, + enum: -> { Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os } + # @!attribute record_session # # @return [Boolean, nil] @@ -433,21 +449,30 @@ class BrowserSettings < Stagehand::Internal::Type::BaseModel # @return [Boolean, nil] optional :solve_captchas, Stagehand::Internal::Type::Boolean, api_name: :solveCaptchas + # @!attribute verified + # + # @return [Boolean, nil] + optional :verified, Stagehand::Internal::Type::Boolean + # @!attribute viewport # # @return [Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport, nil] optional :viewport, -> { Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport } - # @!method initialize(advanced_stealth: nil, block_ads: nil, context: nil, extension_id: nil, fingerprint: nil, log_session: nil, record_session: nil, solve_captchas: nil, viewport: nil) + # @!method initialize(advanced_stealth: nil, block_ads: nil, captcha_image_selector: nil, captcha_input_selector: nil, context: nil, extension_id: nil, fingerprint: nil, log_session: nil, os: nil, record_session: nil, solve_captchas: nil, verified: nil, viewport: nil) # @param advanced_stealth [Boolean] # @param block_ads [Boolean] + # @param captcha_image_selector [String] + # @param captcha_input_selector [String] # @param context [Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Context] # @param extension_id [String] # @param fingerprint [Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Fingerprint] # @param log_session [Boolean] + # @param os [Symbol, Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os] # @param record_session [Boolean] # @param solve_captchas [Boolean] + # @param verified [Boolean] # @param viewport [Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport] # @see Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings#context @@ -596,6 +621,20 @@ class Screen < Stagehand::Internal::Type::BaseModel end end + # @see Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings#os + module Os + extend Stagehand::Internal::Type::Enum + + WINDOWS = :windows + MAC = :mac + LINUX = :linux + MOBILE = :mobile + TABLET = :tablet + + # @!method self.values + # @return [Array] + end + # @see Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings#viewport class Viewport < Stagehand::Internal::Type::BaseModel # @!attribute height diff --git a/lib/stagehand/version.rb b/lib/stagehand/version.rb index b4bbb16..2fbf718 100644 --- a/lib/stagehand/version.rb +++ b/lib/stagehand/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Stagehand - VERSION = "3.19.3" + VERSION = "3.20.0" end diff --git a/rbi/stagehand/models/session_start_params.rbi b/rbi/stagehand/models/session_start_params.rbi index 67dc4c0..4ea4b10 100644 --- a/rbi/stagehand/models/session_start_params.rbi +++ b/rbi/stagehand/models/session_start_params.rbi @@ -800,6 +800,18 @@ module Stagehand sig { params(block_ads: T::Boolean).void } attr_writer :block_ads + sig { returns(T.nilable(String)) } + attr_reader :captcha_image_selector + + sig { params(captcha_image_selector: String).void } + attr_writer :captcha_image_selector + + sig { returns(T.nilable(String)) } + attr_reader :captcha_input_selector + + sig { params(captcha_input_selector: String).void } + attr_writer :captcha_input_selector + sig do returns( T.nilable( @@ -846,6 +858,23 @@ module Stagehand sig { params(log_session: T::Boolean).void } attr_writer :log_session + sig do + returns( + T.nilable( + Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os::OrSymbol + ) + ) + end + attr_reader :os + + sig do + params( + os: + Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os::OrSymbol + ).void + end + attr_writer :os + sig { returns(T.nilable(T::Boolean)) } attr_reader :record_session @@ -858,6 +887,12 @@ module Stagehand sig { params(solve_captchas: T::Boolean).void } attr_writer :solve_captchas + sig { returns(T.nilable(T::Boolean)) } + attr_reader :verified + + sig { params(verified: T::Boolean).void } + attr_writer :verified + sig do returns( T.nilable( @@ -879,14 +914,19 @@ module Stagehand params( advanced_stealth: T::Boolean, block_ads: T::Boolean, + captcha_image_selector: String, + captcha_input_selector: String, context: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Context::OrHash, extension_id: String, fingerprint: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Fingerprint::OrHash, log_session: T::Boolean, + os: + Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os::OrSymbol, record_session: T::Boolean, solve_captchas: T::Boolean, + verified: T::Boolean, viewport: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport::OrHash ).returns(T.attached_class) @@ -894,12 +934,16 @@ module Stagehand def self.new( advanced_stealth: nil, block_ads: nil, + captcha_image_selector: nil, + captcha_input_selector: nil, context: nil, extension_id: nil, fingerprint: nil, log_session: nil, + os: nil, record_session: nil, solve_captchas: nil, + verified: nil, viewport: nil ) end @@ -909,14 +953,19 @@ module Stagehand { advanced_stealth: T::Boolean, block_ads: T::Boolean, + captcha_image_selector: String, + captcha_input_selector: String, context: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Context, extension_id: String, fingerprint: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Fingerprint, log_session: T::Boolean, + os: + Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os::OrSymbol, record_session: T::Boolean, solve_captchas: T::Boolean, + verified: T::Boolean, viewport: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport } @@ -1348,6 +1397,55 @@ module Stagehand end end + module Os + extend Stagehand::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + WINDOWS = + T.let( + :windows, + Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os::TaggedSymbol + ) + MAC = + T.let( + :mac, + Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os::TaggedSymbol + ) + LINUX = + T.let( + :linux, + Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os::TaggedSymbol + ) + MOBILE = + T.let( + :mobile, + Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os::TaggedSymbol + ) + TABLET = + T.let( + :tablet, + Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Os::TaggedSymbol + ] + ) + end + def self.values + end + end + class Viewport < Stagehand::Internal::Type::BaseModel OrHash = T.type_alias do diff --git a/sig/stagehand/models/session_start_params.rbs b/sig/stagehand/models/session_start_params.rbs index c9cae4c..af70a2b 100644 --- a/sig/stagehand/models/session_start_params.rbs +++ b/sig/stagehand/models/session_start_params.rbs @@ -450,12 +450,16 @@ module Stagehand { advanced_stealth: bool, block_ads: bool, + captcha_image_selector: String, + captcha_input_selector: String, context: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Context, extension_id: String, fingerprint: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Fingerprint, log_session: bool, + os: Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::os, record_session: bool, solve_captchas: bool, + verified: bool, viewport: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport } @@ -468,6 +472,14 @@ module Stagehand def block_ads=: (bool) -> bool + attr_reader captcha_image_selector: String? + + def captcha_image_selector=: (String) -> String + + attr_reader captcha_input_selector: String? + + def captcha_input_selector=: (String) -> String + attr_reader context: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Context? def context=: ( @@ -488,6 +500,12 @@ module Stagehand def log_session=: (bool) -> bool + attr_reader os: Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::os? + + def os=: ( + Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::os + ) -> Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::os + attr_reader record_session: bool? def record_session=: (bool) -> bool @@ -496,6 +514,10 @@ module Stagehand def solve_captchas=: (bool) -> bool + attr_reader verified: bool? + + def verified=: (bool) -> bool + attr_reader viewport: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport? def viewport=: ( @@ -505,24 +527,32 @@ module Stagehand def initialize: ( ?advanced_stealth: bool, ?block_ads: bool, + ?captcha_image_selector: String, + ?captcha_input_selector: String, ?context: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Context, ?extension_id: String, ?fingerprint: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Fingerprint, ?log_session: bool, + ?os: Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::os, ?record_session: bool, ?solve_captchas: bool, + ?verified: bool, ?viewport: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport ) -> void def to_hash: -> { advanced_stealth: bool, block_ads: bool, + captcha_image_selector: String, + captcha_input_selector: String, context: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Context, extension_id: String, fingerprint: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Fingerprint, log_session: bool, + os: Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::os, record_session: bool, solve_captchas: bool, + verified: bool, viewport: Stagehand::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::Viewport } @@ -693,6 +723,20 @@ module Stagehand end end + type os = :windows | :mac | :linux | :mobile | :tablet + + module Os + extend Stagehand::Internal::Type::Enum + + WINDOWS: :windows + MAC: :mac + LINUX: :linux + MOBILE: :mobile + TABLET: :tablet + + def self?.values: -> ::Array[Stagehand::Models::SessionStartParams::BrowserbaseSessionCreateParams::BrowserSettings::os] + end + type viewport = { height: Float, width: Float } class Viewport < Stagehand::Internal::Type::BaseModel