Skip to content

Commit 9d81781

Browse files
feat(dashboard): add browser replays support for past browsers
1 parent 7cbec18 commit 9d81781

File tree

7 files changed

+94
-23
lines changed

7 files changed

+94
-23
lines changed

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 91
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-1e490dbef30dfa53ccba72524fcba4079f244f2530a4f770c00f8fee707eaa72.yml
3-
openapi_spec_hash: 1fd15429610959f19aed6d3cb170ab9e
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-68729f2ff40476377ead9019c18ea140fc4efbc2e68d7c4fc323bd61ae81f768.yml
3+
openapi_spec_hash: 9eec61481f9059b5fedc13abc3e39338
44
config_hash: cc7fdd701d995d4b3456d77041c604cf

api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ from kernel.types import (
8989
Methods:
9090

9191
- <code title="post /browsers">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">create</a>(\*\*<a href="src/kernel/types/browser_create_params.py">params</a>) -> <a href="./src/kernel/types/browser_create_response.py">BrowserCreateResponse</a></code>
92-
- <code title="get /browsers/{id}">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">retrieve</a>(id) -> <a href="./src/kernel/types/browser_retrieve_response.py">BrowserRetrieveResponse</a></code>
92+
- <code title="get /browsers/{id}">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">retrieve</a>(id, \*\*<a href="src/kernel/types/browser_retrieve_params.py">params</a>) -> <a href="./src/kernel/types/browser_retrieve_response.py">BrowserRetrieveResponse</a></code>
9393
- <code title="patch /browsers/{id}">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">update</a>(id, \*\*<a href="src/kernel/types/browser_update_params.py">params</a>) -> <a href="./src/kernel/types/browser_update_response.py">BrowserUpdateResponse</a></code>
9494
- <code title="get /browsers">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">list</a>(\*\*<a href="src/kernel/types/browser_list_params.py">params</a>) -> <a href="./src/kernel/types/browser_list_response.py">SyncOffsetPagination[BrowserListResponse]</a></code>
9595
- <code title="delete /browsers">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">delete</a>(\*\*<a href="src/kernel/types/browser_delete_params.py">params</a>) -> None</code>

src/kernel/resources/browsers/browsers.py

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import typing_extensions
66
from typing import Mapping, Iterable, Optional, cast
7+
from typing_extensions import Literal
78

89
import httpx
910

@@ -28,6 +29,7 @@
2829
browser_create_params,
2930
browser_delete_params,
3031
browser_update_params,
32+
browser_retrieve_params,
3133
browser_load_extensions_params,
3234
)
3335
from .process import (
@@ -226,6 +228,7 @@ def retrieve(
226228
self,
227229
id: str,
228230
*,
231+
include_deleted: bool | Omit = omit,
229232
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
230233
# The extra values given here take precedence over values defined on the client or passed to this method.
231234
extra_headers: Headers | None = None,
@@ -237,6 +240,8 @@ def retrieve(
237240
Get information about a browser session.
238241
239242
Args:
243+
include_deleted: When true, includes soft-deleted browser sessions in the lookup.
244+
240245
extra_headers: Send extra headers
241246
242247
extra_query: Add additional query parameters to the request
@@ -250,7 +255,13 @@ def retrieve(
250255
return self._get(
251256
f"/browsers/{id}",
252257
options=make_request_options(
253-
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
258+
extra_headers=extra_headers,
259+
extra_query=extra_query,
260+
extra_body=extra_body,
261+
timeout=timeout,
262+
query=maybe_transform(
263+
{"include_deleted": include_deleted}, browser_retrieve_params.BrowserRetrieveParams
264+
),
254265
),
255266
cast_to=BrowserRetrieveResponse,
256267
)
@@ -300,6 +311,7 @@ def list(
300311
include_deleted: bool | Omit = omit,
301312
limit: int | Omit = omit,
302313
offset: int | Omit = omit,
314+
status: Literal["active", "deleted", "all"] | Omit = omit,
303315
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
304316
# The extra values given here take precedence over values defined on the client or passed to this method.
305317
extra_headers: Headers | None = None,
@@ -309,17 +321,20 @@ def list(
309321
) -> SyncOffsetPagination[BrowserListResponse]:
310322
"""List all browser sessions with pagination support.
311323
312-
Use include_deleted=true to
313-
include soft-deleted sessions in the results.
324+
Use status parameter to
325+
filter by session state.
314326
315327
Args:
316-
include_deleted: When true, includes soft-deleted browser sessions in the results alongside
317-
active sessions.
328+
include_deleted: Deprecated: Use status=all instead. When true, includes soft-deleted browser
329+
sessions in the results alongside active sessions.
318330
319331
limit: Maximum number of results to return. Defaults to 20, maximum 100.
320332
321333
offset: Number of results to skip. Defaults to 0.
322334
335+
status: Filter sessions by status. "active" returns only active sessions (default),
336+
"deleted" returns only soft-deleted sessions, "all" returns both.
337+
323338
extra_headers: Send extra headers
324339
325340
extra_query: Add additional query parameters to the request
@@ -341,6 +356,7 @@ def list(
341356
"include_deleted": include_deleted,
342357
"limit": limit,
343358
"offset": offset,
359+
"status": status,
344360
},
345361
browser_list_params.BrowserListParams,
346362
),
@@ -610,6 +626,7 @@ async def retrieve(
610626
self,
611627
id: str,
612628
*,
629+
include_deleted: bool | Omit = omit,
613630
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
614631
# The extra values given here take precedence over values defined on the client or passed to this method.
615632
extra_headers: Headers | None = None,
@@ -621,6 +638,8 @@ async def retrieve(
621638
Get information about a browser session.
622639
623640
Args:
641+
include_deleted: When true, includes soft-deleted browser sessions in the lookup.
642+
624643
extra_headers: Send extra headers
625644
626645
extra_query: Add additional query parameters to the request
@@ -634,7 +653,13 @@ async def retrieve(
634653
return await self._get(
635654
f"/browsers/{id}",
636655
options=make_request_options(
637-
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
656+
extra_headers=extra_headers,
657+
extra_query=extra_query,
658+
extra_body=extra_body,
659+
timeout=timeout,
660+
query=await async_maybe_transform(
661+
{"include_deleted": include_deleted}, browser_retrieve_params.BrowserRetrieveParams
662+
),
638663
),
639664
cast_to=BrowserRetrieveResponse,
640665
)
@@ -684,6 +709,7 @@ def list(
684709
include_deleted: bool | Omit = omit,
685710
limit: int | Omit = omit,
686711
offset: int | Omit = omit,
712+
status: Literal["active", "deleted", "all"] | Omit = omit,
687713
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
688714
# The extra values given here take precedence over values defined on the client or passed to this method.
689715
extra_headers: Headers | None = None,
@@ -693,17 +719,20 @@ def list(
693719
) -> AsyncPaginator[BrowserListResponse, AsyncOffsetPagination[BrowserListResponse]]:
694720
"""List all browser sessions with pagination support.
695721
696-
Use include_deleted=true to
697-
include soft-deleted sessions in the results.
722+
Use status parameter to
723+
filter by session state.
698724
699725
Args:
700-
include_deleted: When true, includes soft-deleted browser sessions in the results alongside
701-
active sessions.
726+
include_deleted: Deprecated: Use status=all instead. When true, includes soft-deleted browser
727+
sessions in the results alongside active sessions.
702728
703729
limit: Maximum number of results to return. Defaults to 20, maximum 100.
704730
705731
offset: Number of results to skip. Defaults to 0.
706732
733+
status: Filter sessions by status. "active" returns only active sessions (default),
734+
"deleted" returns only soft-deleted sessions, "all" returns both.
735+
707736
extra_headers: Send extra headers
708737
709738
extra_query: Add additional query parameters to the request
@@ -725,6 +754,7 @@ def list(
725754
"include_deleted": include_deleted,
726755
"limit": limit,
727756
"offset": offset,
757+
"status": status,
728758
},
729759
browser_list_params.BrowserListParams,
730760
),

src/kernel/types/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
from .invocation_list_params import InvocationListParams as InvocationListParams
3737
from .invocation_state_event import InvocationStateEvent as InvocationStateEvent
3838
from .browser_create_response import BrowserCreateResponse as BrowserCreateResponse
39+
from .browser_retrieve_params import BrowserRetrieveParams as BrowserRetrieveParams
3940
from .browser_update_response import BrowserUpdateResponse as BrowserUpdateResponse
4041
from .extension_list_response import ExtensionListResponse as ExtensionListResponse
4142
from .extension_upload_params import ExtensionUploadParams as ExtensionUploadParams

src/kernel/types/browser_list_params.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33
from __future__ import annotations
44

5-
from typing_extensions import TypedDict
5+
from typing_extensions import Literal, TypedDict
66

77
__all__ = ["BrowserListParams"]
88

99

1010
class BrowserListParams(TypedDict, total=False):
1111
include_deleted: bool
12-
"""
12+
"""Deprecated: Use status=all instead.
13+
1314
When true, includes soft-deleted browser sessions in the results alongside
1415
active sessions.
1516
"""
@@ -19,3 +20,10 @@ class BrowserListParams(TypedDict, total=False):
1920

2021
offset: int
2122
"""Number of results to skip. Defaults to 0."""
23+
24+
status: Literal["active", "deleted", "all"]
25+
"""Filter sessions by status.
26+
27+
"active" returns only active sessions (default), "deleted" returns only
28+
soft-deleted sessions, "all" returns both.
29+
"""
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from __future__ import annotations
4+
5+
from typing_extensions import TypedDict
6+
7+
__all__ = ["BrowserRetrieveParams"]
8+
9+
10+
class BrowserRetrieveParams(TypedDict, total=False):
11+
include_deleted: bool
12+
"""When true, includes soft-deleted browser sessions in the lookup."""

tests/api_resources/test_browsers.py

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,24 @@ def test_streaming_response_create(self, client: Kernel) -> None:
8787
@parametrize
8888
def test_method_retrieve(self, client: Kernel) -> None:
8989
browser = client.browsers.retrieve(
90-
"htzv5orfit78e1m2biiifpbv",
90+
id="htzv5orfit78e1m2biiifpbv",
91+
)
92+
assert_matches_type(BrowserRetrieveResponse, browser, path=["response"])
93+
94+
@pytest.mark.skip(reason="Prism tests are disabled")
95+
@parametrize
96+
def test_method_retrieve_with_all_params(self, client: Kernel) -> None:
97+
browser = client.browsers.retrieve(
98+
id="htzv5orfit78e1m2biiifpbv",
99+
include_deleted=True,
91100
)
92101
assert_matches_type(BrowserRetrieveResponse, browser, path=["response"])
93102

94103
@pytest.mark.skip(reason="Prism tests are disabled")
95104
@parametrize
96105
def test_raw_response_retrieve(self, client: Kernel) -> None:
97106
response = client.browsers.with_raw_response.retrieve(
98-
"htzv5orfit78e1m2biiifpbv",
107+
id="htzv5orfit78e1m2biiifpbv",
99108
)
100109

101110
assert response.is_closed is True
@@ -107,7 +116,7 @@ def test_raw_response_retrieve(self, client: Kernel) -> None:
107116
@parametrize
108117
def test_streaming_response_retrieve(self, client: Kernel) -> None:
109118
with client.browsers.with_streaming_response.retrieve(
110-
"htzv5orfit78e1m2biiifpbv",
119+
id="htzv5orfit78e1m2biiifpbv",
111120
) as response:
112121
assert not response.is_closed
113122
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -122,7 +131,7 @@ def test_streaming_response_retrieve(self, client: Kernel) -> None:
122131
def test_path_params_retrieve(self, client: Kernel) -> None:
123132
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
124133
client.browsers.with_raw_response.retrieve(
125-
"",
134+
id="",
126135
)
127136

128137
@pytest.mark.skip(reason="Prism tests are disabled")
@@ -189,6 +198,7 @@ def test_method_list_with_all_params(self, client: Kernel) -> None:
189198
include_deleted=True,
190199
limit=1,
191200
offset=0,
201+
status="active",
192202
)
193203
assert_matches_type(SyncOffsetPagination[BrowserListResponse], browser, path=["response"])
194204

@@ -428,15 +438,24 @@ async def test_streaming_response_create(self, async_client: AsyncKernel) -> Non
428438
@parametrize
429439
async def test_method_retrieve(self, async_client: AsyncKernel) -> None:
430440
browser = await async_client.browsers.retrieve(
431-
"htzv5orfit78e1m2biiifpbv",
441+
id="htzv5orfit78e1m2biiifpbv",
442+
)
443+
assert_matches_type(BrowserRetrieveResponse, browser, path=["response"])
444+
445+
@pytest.mark.skip(reason="Prism tests are disabled")
446+
@parametrize
447+
async def test_method_retrieve_with_all_params(self, async_client: AsyncKernel) -> None:
448+
browser = await async_client.browsers.retrieve(
449+
id="htzv5orfit78e1m2biiifpbv",
450+
include_deleted=True,
432451
)
433452
assert_matches_type(BrowserRetrieveResponse, browser, path=["response"])
434453

435454
@pytest.mark.skip(reason="Prism tests are disabled")
436455
@parametrize
437456
async def test_raw_response_retrieve(self, async_client: AsyncKernel) -> None:
438457
response = await async_client.browsers.with_raw_response.retrieve(
439-
"htzv5orfit78e1m2biiifpbv",
458+
id="htzv5orfit78e1m2biiifpbv",
440459
)
441460

442461
assert response.is_closed is True
@@ -448,7 +467,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncKernel) -> None:
448467
@parametrize
449468
async def test_streaming_response_retrieve(self, async_client: AsyncKernel) -> None:
450469
async with async_client.browsers.with_streaming_response.retrieve(
451-
"htzv5orfit78e1m2biiifpbv",
470+
id="htzv5orfit78e1m2biiifpbv",
452471
) as response:
453472
assert not response.is_closed
454473
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -463,7 +482,7 @@ async def test_streaming_response_retrieve(self, async_client: AsyncKernel) -> N
463482
async def test_path_params_retrieve(self, async_client: AsyncKernel) -> None:
464483
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
465484
await async_client.browsers.with_raw_response.retrieve(
466-
"",
485+
id="",
467486
)
468487

469488
@pytest.mark.skip(reason="Prism tests are disabled")
@@ -530,6 +549,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncKernel) -> N
530549
include_deleted=True,
531550
limit=1,
532551
offset=0,
552+
status="active",
533553
)
534554
assert_matches_type(AsyncOffsetPagination[BrowserListResponse], browser, path=["response"])
535555

0 commit comments

Comments
 (0)