hyperbrowser 0.90.2__tar.gz → 0.90.4__tar.gz

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 (91) hide show
  1. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/PKG-INFO +1 -1
  2. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sandboxes/shared.py +23 -6
  3. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/consts.py +1 -0
  4. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/sandbox_common.py +50 -2
  5. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/pyproject.toml +1 -1
  6. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/LICENSE +0 -0
  7. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/README.md +0 -0
  8. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/__init__.py +0 -0
  9. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/async_client.py +0 -0
  10. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/base.py +0 -0
  11. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/agents/__init__.py +0 -0
  12. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/agents/browser_use.py +0 -0
  13. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/agents/claude_computer_use.py +0 -0
  14. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/agents/cua.py +0 -0
  15. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/agents/gemini_computer_use.py +0 -0
  16. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/agents/hyper_agent.py +0 -0
  17. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/computer_action.py +0 -0
  18. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/crawl.py +0 -0
  19. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/extension.py +0 -0
  20. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/extract.py +0 -0
  21. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/profile.py +0 -0
  22. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/sandbox.py +0 -0
  23. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/sandboxes/__init__.py +0 -0
  24. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_files.py +0 -0
  25. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_processes.py +0 -0
  26. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_terminal.py +0 -0
  27. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/sandboxes/sandbox_transport.py +0 -0
  28. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/scrape.py +0 -0
  29. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/session.py +0 -0
  30. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/team.py +0 -0
  31. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/volume.py +0 -0
  32. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/web/__init__.py +0 -0
  33. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/web/batch_fetch.py +0 -0
  34. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/async_manager/web/crawl.py +0 -0
  35. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sandboxes/__init__.py +0 -0
  36. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/agents/__init__.py +0 -0
  37. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/agents/browser_use.py +0 -0
  38. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/agents/claude_computer_use.py +0 -0
  39. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/agents/cua.py +0 -0
  40. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/agents/gemini_computer_use.py +0 -0
  41. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/agents/hyper_agent.py +0 -0
  42. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/computer_action.py +0 -0
  43. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/crawl.py +0 -0
  44. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/extension.py +0 -0
  45. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/extract.py +0 -0
  46. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/profile.py +0 -0
  47. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/sandbox.py +0 -0
  48. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/sandboxes/__init__.py +0 -0
  49. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_files.py +0 -0
  50. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_processes.py +0 -0
  51. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_terminal.py +0 -0
  52. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/sandboxes/sandbox_transport.py +0 -0
  53. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/scrape.py +0 -0
  54. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/session.py +0 -0
  55. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/team.py +0 -0
  56. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/volume.py +0 -0
  57. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/web/__init__.py +0 -0
  58. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/web/batch_fetch.py +0 -0
  59. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/managers/sync_manager/web/crawl.py +0 -0
  60. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/client/sync.py +0 -0
  61. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/config.py +0 -0
  62. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/exceptions.py +0 -0
  63. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/__init__.py +0 -0
  64. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/_parsers.py +0 -0
  65. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/agents/browser_use.py +0 -0
  66. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/agents/claude_computer_use.py +0 -0
  67. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/agents/cua.py +0 -0
  68. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/agents/gemini_computer_use.py +0 -0
  69. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/agents/hyper_agent.py +0 -0
  70. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/computer_action.py +0 -0
  71. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/crawl.py +0 -0
  72. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/extension.py +0 -0
  73. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/extract.py +0 -0
  74. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/profile.py +0 -0
  75. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/sandbox.py +0 -0
  76. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/scrape.py +0 -0
  77. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/session.py +0 -0
  78. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/team.py +0 -0
  79. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/volume.py +0 -0
  80. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/web/batch_fetch.py +0 -0
  81. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/web/common.py +0 -0
  82. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/web/crawl.py +0 -0
  83. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/web/fetch.py +0 -0
  84. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/models/web/search.py +0 -0
  85. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/tools/__init__.py +0 -0
  86. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/tools/anthropic.py +0 -0
  87. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/tools/openai.py +0 -0
  88. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/tools/schema.py +0 -0
  89. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/transport/async_transport.py +0 -0
  90. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/transport/base.py +0 -0
  91. {hyperbrowser-0.90.2 → hyperbrowser-0.90.4}/hyperbrowser/transport/sync.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hyperbrowser
3
- Version: 0.90.2
3
+ Version: 0.90.4
4
4
  Summary: Python SDK for hyperbrowser
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -17,6 +17,7 @@ from ....sandbox_common import (
17
17
  RUNTIME_SESSION_REFRESH_BUFFER_MS,
18
18
  normalize_network_error,
19
19
  parse_error_payload,
20
+ runtime_base_url_session_id,
20
21
  )
21
22
 
22
23
  DEFAULT_WATCH_TIMEOUT_MS = 60_000
@@ -84,13 +85,31 @@ def _normalize_exec_params(
84
85
  return _normalize_legacy_process_fields(normalized)
85
86
 
86
87
 
88
+ def _resolve_sandbox_runtime_session_host(runtime, base_url) -> str:
89
+ session_id_from_base_path = runtime_base_url_session_id(base_url.path)
90
+ if session_id_from_base_path and base_url.hostname:
91
+ return f"{session_id_from_base_path}.{base_url.hostname}"
92
+
93
+ runtime_host = str(getattr(runtime, "host", "") or "").strip()
94
+ if runtime_host:
95
+ parsed_host = urlsplit(runtime_host)
96
+ if parsed_host.hostname:
97
+ session_id_from_host_path = runtime_base_url_session_id(parsed_host.path)
98
+ if session_id_from_host_path:
99
+ return f"{session_id_from_host_path}.{parsed_host.hostname}"
100
+ return parsed_host.hostname
101
+ return runtime_host
102
+
103
+ return base_url.hostname or ""
104
+
105
+
87
106
  def _build_sandbox_exposed_url(runtime, port: int) -> str:
88
107
  parsed = urlsplit(runtime.base_url)
89
- hostname = parsed.hostname
90
- if not hostname:
108
+ session_host = _resolve_sandbox_runtime_session_host(runtime, parsed)
109
+ if not session_host:
91
110
  return runtime.base_url
92
111
 
93
- exposed_host = f"{port}-{hostname}"
112
+ exposed_host = f"{port}-{session_host}"
94
113
  netloc = exposed_host
95
114
  if parsed.port:
96
115
  netloc = f"{netloc}:{parsed.port}"
@@ -100,9 +119,7 @@ def _build_sandbox_exposed_url(runtime, port: int) -> str:
100
119
  credentials = f"{credentials}:{parsed.password}"
101
120
  netloc = f"{credentials}@{netloc}"
102
121
 
103
- path = parsed.path or "/"
104
-
105
- return urlunsplit((parsed.scheme, netloc, path, parsed.query, parsed.fragment))
122
+ return urlunsplit((parsed.scheme, netloc, "/", "", ""))
106
123
 
107
124
 
108
125
  def _expires_within_buffer(expires_at: Optional[datetime]) -> bool:
@@ -63,6 +63,7 @@ HyperAgentLlm = Literal[
63
63
  ClaudeComputerUseLlm = Literal[
64
64
  "claude-opus-4-5",
65
65
  "claude-opus-4-6",
66
+ "claude-opus-4-7",
66
67
  "claude-haiku-4-5-20251001",
67
68
  "claude-sonnet-4-6",
68
69
  "claude-sonnet-4-5",
@@ -114,13 +114,61 @@ def has_scheme(value: str) -> bool:
114
114
  return "://" in value
115
115
 
116
116
 
117
+ def runtime_base_url_session_id(runtime_base_url: str) -> Optional[str]:
118
+ parsed_base_url = urlsplit(runtime_base_url.strip())
119
+ segments = [
120
+ segment
121
+ for segment in parsed_base_url.path.strip().strip("/").split("/")
122
+ if segment
123
+ ]
124
+ if len(segments) < 2 or segments[0] != "sandbox" or not segments[1].strip():
125
+ return None
126
+ return segments[1].strip()
127
+
128
+
129
+ def should_prepend_sandbox_to_runtime_api(runtime_base_url: str) -> bool:
130
+ return runtime_base_url_session_id(runtime_base_url) is None
131
+
132
+
133
+ def normalize_runtime_api_path(pathname: str, prepend_sandbox: bool) -> str:
134
+ trimmed = pathname.strip()
135
+ if trimmed == "":
136
+ return "/sandbox" if prepend_sandbox else "/"
137
+
138
+ absolute = trimmed if trimmed.startswith("/") else f"/{trimmed}"
139
+ if prepend_sandbox:
140
+ if absolute == "/sandbox" or absolute.startswith("/sandbox/"):
141
+ return absolute
142
+ return f"/sandbox{absolute}"
143
+
144
+ if absolute == "/sandbox":
145
+ return "/"
146
+ if absolute.startswith("/sandbox/"):
147
+ return f"/{absolute[len('/sandbox/'):]}"
148
+ return absolute
149
+
150
+
151
+ def normalize_runtime_relative_path(base_url: str, path: str) -> str:
152
+ trimmed = path.strip()
153
+ if trimmed == "":
154
+ return ""
155
+
156
+ parsed_path = urlsplit(trimmed)
157
+ prepend_sandbox = should_prepend_sandbox_to_runtime_api(base_url)
158
+ normalized_path = normalize_runtime_api_path(parsed_path.path, prepend_sandbox)
159
+ relative_path = normalized_path.lstrip("/")
160
+ return urlunsplit(
161
+ ("", "", relative_path, parsed_path.query, parsed_path.fragment)
162
+ )
163
+
164
+
117
165
  def resolve_runtime_transport_target(
118
166
  base_url: str,
119
167
  path: str,
120
168
  runtime_proxy_override: Optional[str] = None,
121
169
  ) -> RuntimeTransportTarget:
122
170
  normalized_base = base_url if base_url.endswith("/") else f"{base_url}/"
123
- url = urljoin(normalized_base, path.lstrip("/"))
171
+ url = urljoin(normalized_base, normalize_runtime_relative_path(base_url, path))
124
172
 
125
173
  if not runtime_proxy_override:
126
174
  return RuntimeTransportTarget(url=url)
@@ -151,7 +199,7 @@ def to_websocket_transport_target(
151
199
  runtime_proxy_override: Optional[str] = None,
152
200
  ) -> RuntimeTransportTarget:
153
201
  normalized_base = base_url if base_url.endswith("/") else f"{base_url}/"
154
- url = urljoin(normalized_base, path.lstrip("/"))
202
+ url = urljoin(normalized_base, normalize_runtime_relative_path(base_url, path))
155
203
  parts = urlsplit(url)
156
204
  scheme = parts.scheme
157
205
  if scheme == "https":
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "hyperbrowser"
3
- version = "0.90.2"
3
+ version = "0.90.4"
4
4
  description = "Python SDK for hyperbrowser"
5
5
  authors = ["Nikhil Shahi <nshahi1998@gmail.com>"]
6
6
  license = "MIT"
File without changes
File without changes