cmdop 0.1.21__py3-none-any.whl → 0.1.23__py3-none-any.whl

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 (36) hide show
  1. cmdop/__init__.py +1 -1
  2. cmdop/_generated/rpc_messages/browser_pb2.py +135 -85
  3. cmdop/_generated/rpc_messages/browser_pb2.pyi +270 -2
  4. cmdop/_generated/rpc_messages_pb2.pyi +25 -0
  5. cmdop/_generated/service_pb2.py +2 -2
  6. cmdop/_generated/service_pb2_grpc.py +345 -0
  7. cmdop/client.py +2 -8
  8. cmdop/services/browser/__init__.py +44 -31
  9. cmdop/services/browser/capabilities/__init__.py +17 -0
  10. cmdop/services/browser/capabilities/_base.py +28 -0
  11. cmdop/services/browser/capabilities/_helpers.py +16 -0
  12. cmdop/services/browser/capabilities/dom.py +76 -0
  13. cmdop/services/browser/capabilities/fetch.py +45 -0
  14. cmdop/services/browser/capabilities/input.py +49 -0
  15. cmdop/services/browser/capabilities/network.py +245 -0
  16. cmdop/services/browser/capabilities/scroll.py +147 -0
  17. cmdop/services/browser/capabilities/timing.py +66 -0
  18. cmdop/services/browser/js/__init__.py +6 -4
  19. cmdop/services/browser/js/interaction.py +34 -0
  20. cmdop/services/browser/models.py +103 -0
  21. cmdop/services/browser/service/__init__.py +5 -0
  22. cmdop/services/browser/service/aio.py +30 -0
  23. cmdop/services/browser/{sync/service.py → service/sync.py} +206 -6
  24. cmdop/services/browser/session.py +194 -0
  25. {cmdop-0.1.21.dist-info → cmdop-0.1.23.dist-info}/METADATA +107 -59
  26. {cmdop-0.1.21.dist-info → cmdop-0.1.23.dist-info}/RECORD +29 -24
  27. cmdop/services/browser/aio/__init__.py +0 -6
  28. cmdop/services/browser/aio/service.py +0 -420
  29. cmdop/services/browser/aio/session.py +0 -407
  30. cmdop/services/browser/base/__init__.py +0 -6
  31. cmdop/services/browser/base/session.py +0 -124
  32. cmdop/services/browser/sync/__init__.py +0 -6
  33. cmdop/services/browser/sync/session.py +0 -644
  34. /cmdop/services/browser/{base/service.py → service/_helpers.py} +0 -0
  35. {cmdop-0.1.21.dist-info → cmdop-0.1.23.dist-info}/WHEEL +0 -0
  36. {cmdop-0.1.21.dist-info → cmdop-0.1.23.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmdop
3
- Version: 0.1.21
3
+ Version: 0.1.23
4
4
  Summary: Python SDK for CMDOP agent interaction
5
5
  Project-URL: Homepage, https://cmdop.com
6
6
  Project-URL: Documentation, https://cmdop.com
@@ -145,91 +145,139 @@ health: Health = result.output # Typed!
145
145
 
146
146
  ## Browser
147
147
 
148
+ Capability-based API for browser automation.
149
+
148
150
  ```python
149
- with client.browser.create_session() as b:
150
- b.navigate("https://shop.com/products")
151
- b.close_modal() # Close popups
151
+ from cmdop.services.browser.models import WaitUntil
152
+
153
+ with client.browser.create_session() as s:
154
+ s.navigate("https://shop.com/products", wait_until=WaitUntil.NETWORKIDLE)
155
+ s.dom.close_modal() # Close popups
152
156
 
153
157
  # BeautifulSoup parsing
154
- soup = b.soup() # SoupWrapper with chainable API
158
+ soup = s.dom.soup() # SoupWrapper with chainable API
155
159
  for item in soup.select(".product"):
156
160
  title = item.select_one("h2").text()
157
161
  price = item.attr("data-price")
158
162
 
159
163
  # Scrolling with random delays
160
164
  for _ in range(10):
161
- soup = b.soup(".listings")
162
- # ... parse ...
163
- b.scroll("down", 700)
164
- b.wait_random(0.8, 1.5) # Random delay
165
+ soup = s.dom.soup(".listings")
166
+ s.scroll.js("down", 700)
167
+ s.timing.random(0.8, 1.5)
165
168
 
166
- # Click with cursor movement (human-like)
167
- b.click("button.buy", move_cursor=True) # Moves cursor before clicking
169
+ # Click with cursor movement
170
+ s.click("button.buy", move_cursor=True)
168
171
 
169
172
  # Click all "See more" buttons
170
- b.click_all_by_text("See more")
173
+ s.input.click_all("See more")
171
174
 
172
- # Native mouse operations
173
- b.mouse_move(500, 300) # Smooth cursor movement
174
- b.hover(".tooltip-trigger") # Hover to reveal tooltip
175
+ # Mouse operations
176
+ s.input.mouse_move(500, 300)
177
+ s.input.hover(".tooltip-trigger")
175
178
 
176
179
  # JS fetch (bypass CORS, inherit cookies)
177
- data = b.fetch_json("https://api.site.com/v1/items")
180
+ data = s.fetch.json("/api/items")
178
181
  ```
179
182
 
183
+ ### Core Methods (on session)
184
+
180
185
  | Method | Description |
181
186
  |--------|-------------|
182
- | `navigate(url)` | Go to URL |
183
- | `click(selector, move_cursor)` | Click element (optionally move cursor first) |
184
- | `click_all_by_text(text, role)` | Click all matching elements |
187
+ | `navigate(url, wait_until)` | Go to URL (wait_until: LOAD, DOMCONTENTLOADED, NETWORKIDLE, COMMIT) |
188
+ | `click(selector, move_cursor)` | Click element |
185
189
  | `type(selector, text)` | Type text |
186
- | `wait_for(selector, ms)` | Wait for element |
187
- | `wait_seconds(n)` | Sleep |
188
- | `wait_random(min, max)` | Random sleep |
189
- | `extract(selector, attr)` | Get text/attr |
190
- | `get_html(selector)` | Get HTML |
191
- | `soup(selector)` | → SoupWrapper |
192
- | `parse_html(html)` | → BeautifulSoup |
193
- | `fetch_json(url)` | JS fetch → dict |
194
- | `fetch_all(urls)` | Parallel fetch |
195
- | `execute_js(code)` | Run async JS |
190
+ | `wait_for(selector)` | Wait for element |
191
+ | `execute_script(js)` | Run JavaScript |
196
192
  | `screenshot()` | PNG bytes |
197
- | `scroll(dir, amount, ...)` | Native scroll page |
198
- | `scroll_to(selector)` | Scroll element into view |
199
- | `get_scroll_info()` | Position + page size |
200
- | `get_page_info()` | Comprehensive page info |
201
- | `mouse_move(x, y, steps)` | Move cursor to coordinates |
202
- | `hover(selector)` | Hover over element |
193
+ | `get_state()` | URL + title |
194
+ | `get_page_info()` | Full page info |
195
+ | `get/set_cookies()` | Cookie management |
196
+
197
+ ### Capabilities
198
+
199
+ **`session.scroll`** - Scrolling
200
+ | Method | Description |
201
+ |--------|-------------|
202
+ | `js(dir, amount)` | JS scroll (works on complex sites) |
203
+ | `native(dir, amount)` | Browser API scroll |
204
+ | `to_bottom()` | Scroll to page bottom |
205
+ | `to_element(selector)` | Scroll element into view |
206
+ | `info()` | Get scroll position |
207
+ | `infinite(extract_fn)` | Smart infinite scroll with extraction |
208
+
209
+ **`session.input`** - Input operations
210
+ | Method | Description |
211
+ |--------|-------------|
212
+ | `click_js(selector)` | JS click (reliable) |
213
+ | `click_all(text, role)` | Click all matching elements |
214
+ | `key(key, selector)` | Press keyboard key |
215
+ | `hover(selector)` | Hover over element (native) |
216
+ | `hover_js(selector)` | Hover via JS |
217
+ | `mouse_move(x, y)` | Move cursor to coordinates |
218
+
219
+ **`session.timing`** - Delays
220
+ | Method | Description |
221
+ |--------|-------------|
222
+ | `wait(ms)` | Wait milliseconds |
223
+ | `seconds(n)` | Wait seconds |
224
+ | `random(min, max)` | Random delay |
225
+ | `timeout(fn, sec, cleanup)` | Run with timeout |
226
+
227
+ **`session.dom`** - DOM operations
228
+ | Method | Description |
229
+ |--------|-------------|
230
+ | `html(selector)` | Get HTML |
231
+ | `text(selector)` | Get text content |
232
+ | `soup(selector)` | → SoupWrapper |
233
+ | `parse(html)` | → BeautifulSoup |
234
+ | `extract(selector, attr)` | Get text/attr list |
203
235
  | `select(selector, value)` | Dropdown select |
204
236
  | `close_modal()` | Close dialogs |
205
- | `press_key(key, selector)` | Press keyboard key |
206
- | `get/set_cookies()` | Cookie management |
207
- | `with_timeout(fn, sec, cleanup)` | Run with timeout, skip if hangs |
208
237
 
209
- **with_timeout() - Smart timeout for long operations:**
238
+ **`session.fetch`** - HTTP from browser context
239
+ | Method | Description |
240
+ |--------|-------------|
241
+ | `json(url)` | Fetch JSON |
242
+ | `all(requests)` | Parallel fetch |
243
+ | `execute(js_code)` | Custom JS fetch code |
244
+
245
+ **`session.network`** - Network capture (v2.19.0)
246
+ | Method | Description |
247
+ |--------|-------------|
248
+ | `enable(max_exchanges)` | Start capturing HTTP traffic |
249
+ | `disable()` | Stop capturing |
250
+ | `get_all()` | Get all captured exchanges |
251
+ | `filter(url_pattern, methods, status_codes)` | Filter exchanges |
252
+ | `last(url_pattern)` | Get most recent matching exchange |
253
+ | `api_calls(url_pattern)` | Get XHR/Fetch calls matching pattern |
254
+ | `last_json(url_pattern)` | Get JSON body from last matching response |
255
+ | `wait_for(url_pattern, timeout_ms)` | Wait for matching request |
256
+ | `stats()` | Capture statistics |
257
+ | `export_har()` | Export to HAR format |
258
+ | `clear()` | Clear captured data |
259
+
210
260
  ```python
211
- # Sync
212
- result, ok = browser.with_timeout(
213
- lambda: process_item(browser, item),
214
- timeout_sec=60,
215
- on_timeout=lambda: browser.press_key('Escape'),
216
- )
217
- if not ok:
218
- print("Skipped - timed out")
261
+ # Example: Intercept API responses
262
+ from cmdop.services.browser.models import WaitUntil
219
263
 
220
- # Async
221
- result, ok = await browser.with_timeout(
222
- process_item(browser, item), # coroutine
223
- timeout_sec=60,
224
- on_timeout=lambda: browser.press_key('Escape'),
225
- )
226
- ```
264
+ with client.browser.create_session() as s:
265
+ s.network.enable()
266
+ s.navigate("https://app.example.com", wait_until=WaitUntil.NETWORKIDLE)
227
267
 
228
- **scroll() parameters:**
229
- - `direction`: "up", "down", "left", "right"
230
- - `amount`: pixels to scroll
231
- - `smooth`: animate scroll (default True)
232
- - `selector`: scroll element into view (alternative to direction/amount)
268
+ # Get last API response
269
+ api = s.network.last("/api/data")
270
+ data = api.json_body()
271
+
272
+ # Filter by criteria
273
+ posts = s.network.filter(
274
+ url_pattern="/api/posts",
275
+ methods=["GET"],
276
+ status_codes=[200],
277
+ )
278
+
279
+ s.network.disable()
280
+ ```
233
281
 
234
282
  ## SDKBaseModel
235
283
 
@@ -1,5 +1,5 @@
1
- cmdop/__init__.py,sha256=36xYFVpp83AE5E8N5T1qbrIaFCC2sSXQJRha5fXpyD0,5200
2
- cmdop/client.py,sha256=NzCBMIAj2vnVzwU1OUttW_kpgJh5aRtmixOwa9HUUUg,14924
1
+ cmdop/__init__.py,sha256=eqEIR3w99NYHsoGF6FioESxTgQhB2yWiARNYWbmNdkk,5200
2
+ cmdop/client.py,sha256=nTotStZPBfYN3TrHH-OlEJMSVAXskYMQRkocsFmyaBY,14601
3
3
  cmdop/config.py,sha256=vpw1aGCyS4NKlZyzVur81Lt06QmN3FnscZji0bypUi0,4398
4
4
  cmdop/discovery.py,sha256=HNxSOa5tSuG7ppfFs21XdviW5ucjpRswVPguhX5j8Dg,7479
5
5
  cmdop/exceptions.py,sha256=-ubepNXXpasXDmlKhl3k0MhWRsI6Oj46Ic_jH4VUw-g,10314
@@ -24,11 +24,11 @@ cmdop/_generated/file_rpc_pb2_grpc.py,sha256=HddeBZYoBOUkx4yPq2qdpwv2QmQouSbwCkf
24
24
  cmdop/_generated/message_pool.py,sha256=ncIr4Z2KeinOVGyzmR-Drc76DZnDTwWl4-bQYcIl8uM,97
25
25
  cmdop/_generated/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  cmdop/_generated/rpc_messages_pb2.py,sha256=X3iog1k2vUDna-hBpEXy0E9-D05mkDWlmBSy0L_yhmQ,2734
27
- cmdop/_generated/rpc_messages_pb2.pyi,sha256=URIFseWilxDjTnLr-INgNLabALY85QgHwPW8yxIPQFI,8400
27
+ cmdop/_generated/rpc_messages_pb2.pyi,sha256=ddIPYj1axgsGwSc0KO1lTnCknJexEqeRz3VEwsLzG0E,10507
28
28
  cmdop/_generated/rpc_messages_pb2_grpc.py,sha256=WHRqOkW1r_9wP5Sd1Bc20jDVErtDN_xHvhsv8r8xyss,892
29
- cmdop/_generated/service_pb2.py,sha256=qMyy-hlP7pUotqDdsb0gt9Gg6oYYrWa9feQdB4T0s8Y,12310
29
+ cmdop/_generated/service_pb2.py,sha256=WRgcxz-wh7RWXTXcBTgw85V5uAgsc68UGaD0gAGwAxE,13315
30
30
  cmdop/_generated/service_pb2.pyi,sha256=-q-RU8TbkwpnKuBQGIhEsjGXj8ltD87sdzgC3B6zKYY,1649
31
- cmdop/_generated/service_pb2_grpc.py,sha256=cysF2oZthsUqaA8kqgNEhHbWFHNhAVDqVO1tveNSzJ4,108911
31
+ cmdop/_generated/service_pb2_grpc.py,sha256=ulLybECN-LLMMYlUG3XJw7Fmfz8PD0jRWwVHmhlYPjs,124703
32
32
  cmdop/_generated/tunnel_pb2.py,sha256=oF5qOSw_9faeXtVFELfEw1dq3TtPOUWl1v6DzUqguGo,3928
33
33
  cmdop/_generated/tunnel_pb2.pyi,sha256=ipcoNwnTLY16IfA95SbTP7REypE65ZVpf6akF7h4FCw,4925
34
34
  cmdop/_generated/tunnel_pb2_grpc.py,sha256=yutTebujge5cHC3h84FKWSdvGBuPVYOkRDy0UGtHZ6c,886
@@ -80,8 +80,8 @@ cmdop/_generated/rpc_messages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
80
80
  cmdop/_generated/rpc_messages/agent_pb2.py,sha256=1KCs4kwuuTwZm9Y8ql7t6Jjsutuepbq85E6DGVDWa84,3393
81
81
  cmdop/_generated/rpc_messages/agent_pb2.pyi,sha256=F7gy0PQlJ4cRQCli7U4v5A87-Lsw2_x0nV4hFXG1qj0,3866
82
82
  cmdop/_generated/rpc_messages/agent_pb2_grpc.py,sha256=ABbaG1eMcaWPZKdPoom2F-IjjVqjYNMDOjMp8X6QLHE,898
83
- cmdop/_generated/rpc_messages/browser_pb2.py,sha256=VAmjY4WUDXkpYOkS-q6w5qplbpIQGLmqDiS6b3O6UYE,16875
84
- cmdop/_generated/rpc_messages/browser_pb2.pyi,sha256=wA51sejGuiCfj9nEpAeymZwkvv1saQyIbAH5Ntlz0fc,25225
83
+ cmdop/_generated/rpc_messages/browser_pb2.py,sha256=2yuoDnRYtAq34NOg4xFPVo0jz0Tr1ulatT8Qe6Ibty8,24851
84
+ cmdop/_generated/rpc_messages/browser_pb2.pyi,sha256=HXQxtegycSDNrHXaxCnMKqukb2Na4dJTCUAg413c31k,37988
85
85
  cmdop/_generated/rpc_messages/browser_pb2_grpc.py,sha256=P8F8QYLT_kedGq7AXj37Us2hFQOaevdfYMHl0tTdY48,900
86
86
  cmdop/_generated/rpc_messages/device_pb2.py,sha256=nKj7axhR-FVSQoQUd4ENXpc5PU_UCjSlExajLIoeZY8,2435
87
87
  cmdop/_generated/rpc_messages/device_pb2.pyi,sha256=u5oLfTHuOSpYwMiVe2tw0vVQLLFvYgK3lxw-Vky1ZkA,1974
@@ -166,23 +166,28 @@ cmdop/services/base.py,sha256=BCYIUME5gfpDHAief30sQNVzrlAgHx6QGZ6AbLHQx5w,3087
166
166
  cmdop/services/extract.py,sha256=zwzikEKH4T4OnrprmJg3wqBWQJr-DYsSZgJGK_2yIHU,11119
167
167
  cmdop/services/files.py,sha256=RGhfo7tW6diuUWC_EQQ-Y9zO1btm6mBTji0SWWa0fdo,12548
168
168
  cmdop/services/terminal.py,sha256=9SSWBexe2rWgMd-hGBEs9mcax3l7x_U84VHZpMC4xK8,17512
169
- cmdop/services/browser/__init__.py,sha256=BFdrmtvWEiBztds-YITE-8aW4-7-B8jbsQaPsC1M60g,1475
170
- cmdop/services/browser/models.py,sha256=qJ3da8hPvQn7Vtiqg3xg49G-GioidQGPPuLk2c_IBC4,2656
169
+ cmdop/services/browser/__init__.py,sha256=31Ofu9RCYTAedPKLvnor8J7oGDgTjbqJ58OkxxHYwdk,1270
170
+ cmdop/services/browser/models.py,sha256=9MpNFgSgZDIznmTmsCUByEN31t_iQ6kAza1BsPSsuJs,5320
171
171
  cmdop/services/browser/parsing.py,sha256=0hQAy-0ZwJqtmhEqHO3EEdVB3iYmyhXRdouN_dCbig8,3820
172
- cmdop/services/browser/aio/__init__.py,sha256=7DI4Q0LZaAdu3fl8D1SaZ8E3LCGpTw97lqca1pOi5Kk,241
173
- cmdop/services/browser/aio/service.py,sha256=YDn1n6SwZi2SUhooPROjT7WCJX05WFDh71pOSS10KMI,15174
174
- cmdop/services/browser/aio/session.py,sha256=_aVbEQ8-KJWLC6e-R3DGwS3Stw9WzXyoKXdtOqm3xIU,14431
175
- cmdop/services/browser/base/__init__.py,sha256=mgG4y324zSDy-13uQiTg6rlFpaQFLc67ynbykRZuMms,227
176
- cmdop/services/browser/base/service.py,sha256=w8foDUGZcD4HyF5eyLZUFxbx_fctAFsYRovvsksi3l4,1584
177
- cmdop/services/browser/base/session.py,sha256=5-UiBxG3t5TtATih41JaPR9PdmIKfeICTM1RbhRdBok,3773
178
- cmdop/services/browser/js/__init__.py,sha256=lb86NItjLKT6GnePAIA7S9Du3G_Fb5aXe12PuKszYmY,1235
172
+ cmdop/services/browser/session.py,sha256=atSDDrTdkVJ6OrTiz8OaifegedZvbkUZUpfxGKUrDw8,6403
173
+ cmdop/services/browser/capabilities/__init__.py,sha256=UFmqG3XB2xm0MI2jRmsSXyvFyREPbfJnXLzgaragpbU,398
174
+ cmdop/services/browser/capabilities/_base.py,sha256=mW0jKa2CyvK-8cjenv5JYvuCKiO3rpt5F7WtWFXBitA,749
175
+ cmdop/services/browser/capabilities/_helpers.py,sha256=jXqYbeDocAHec2GwF2_BNnJ78vTyUnHteQoS-RSG00k,488
176
+ cmdop/services/browser/capabilities/dom.py,sha256=DuXfildga23wGBNJWtNzx-t2Cq553HC48o9KAWAlyC0,2612
177
+ cmdop/services/browser/capabilities/fetch.py,sha256=IpUrcUAOEanrN4TrB-JVtn3TtJ8GdkyN5qbTbpBWvLc,1310
178
+ cmdop/services/browser/capabilities/input.py,sha256=uYmWGqturMDent44Us80oT_nk4kFNGyPJ0P5I35ulew,1749
179
+ cmdop/services/browser/capabilities/network.py,sha256=tZV4Oh_J5zUjEe9GBLQBDXEVh9EVTecPbyjE7lIUrd0,7775
180
+ cmdop/services/browser/capabilities/scroll.py,sha256=sh0VuOPOv81BZg80-n8TABOj5RpshJT12qJwm4F_OY0,4808
181
+ cmdop/services/browser/capabilities/timing.py,sha256=NH34G_4Kfukh6JCdhLRGoouA-uNTbx9ly7ybP9Kh558,1868
182
+ cmdop/services/browser/js/__init__.py,sha256=gTiZguikKfztDtggZTux2FqhT8YTjyHCzQR4TEnT7z4,1177
179
183
  cmdop/services/browser/js/core.py,sha256=QXCCX_al5tMgz7aCwMqhIs1aRe_IdG8teOJniaumA5Q,995
180
184
  cmdop/services/browser/js/fetch.py,sha256=WPy_H4LLkneSx06wpfnx4Sx_0Okf2ENXi6bveCd9ZCg,2188
181
- cmdop/services/browser/js/interaction.py,sha256=zdCy1l833k_a470qm3Q9QLKQrbSQ5tYgTUa4rVGailc,5444
185
+ cmdop/services/browser/js/interaction.py,sha256=qNcs9XwjXZPJfbg8BPeqw5hXya_xTQsHv1T7VWdQ7qY,6620
182
186
  cmdop/services/browser/js/scroll.py,sha256=yiOMAaR8ac8jCiWgNCVIt1pUGxdvktMUtzv-AVAE-2Q,7823
183
- cmdop/services/browser/sync/__init__.py,sha256=sFePvIsWqhaeCU9fw_ZyOITeeEHvZx4Gtcp8W3KBKG0,222
184
- cmdop/services/browser/sync/service.py,sha256=T-GnxIK2ZmE3KSe5eIsEj63ClQOyxJffxueHtq8BmPI,15467
185
- cmdop/services/browser/sync/session.py,sha256=5wm5WXAQJFEv1R6B2ku0cNePLLbzEwojWqxSFxSBvw8,21786
187
+ cmdop/services/browser/service/__init__.py,sha256=AZH_r2FsxLfJGCVBaaAPw3dTGaUlgIFdlYd_RR8KxSg,100
188
+ cmdop/services/browser/service/_helpers.py,sha256=w8foDUGZcD4HyF5eyLZUFxbx_fctAFsYRovvsksi3l4,1584
189
+ cmdop/services/browser/service/aio.py,sha256=0E2D4igQb3YzAakdXsRMt8PEd0rFxI2gXfimwq_6nzk,767
190
+ cmdop/services/browser/service/sync.py,sha256=40CIqdUAR-ZVFfQJVgUWVgGq3j7mgcpGs1SRe8zXjmI,23096
186
191
  cmdop/streaming/__init__.py,sha256=kG9UlJRqv8ndcwKMzWUddPlZT61pFO_Uf_c08A_8TxA,877
187
192
  cmdop/streaming/base.py,sha256=r7Q2QlRxgULzs9vlSGcOC_fwAQ_cF3Z3M7WsPQtxG5I,2990
188
193
  cmdop/streaming/handlers.py,sha256=FDEhADmCEFRbifvr9dU1X3C-K_96noz89Bl3tuDa_rQ,2616
@@ -193,7 +198,7 @@ cmdop/transport/base.py,sha256=2pkV8i9epgp_21dyReCfX47abRUrnALm0W5BXb-Fuz0,5571
193
198
  cmdop/transport/discovery.py,sha256=rcGAuVrR1l6jwcP0dqZxVhX1NsFK7sRHygFMCLmmUbA,10673
194
199
  cmdop/transport/local.py,sha256=ob6tWVxSdKwblHSMK8CkgjyuSdQoAeWgy5OAUd5ZNuE,7411
195
200
  cmdop/transport/remote.py,sha256=FNVqus9wOv7LlxKarXjLmSyvJiHwhvPbNDOPv1IQkmE,4329
196
- cmdop-0.1.21.dist-info/METADATA,sha256=Ewv9fVmpTmxU7NWpmQzyEWWB0ce6dBjpJnsuQ-n4mso,7532
197
- cmdop-0.1.21.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
198
- cmdop-0.1.21.dist-info/licenses/LICENSE,sha256=6hyzbI1QVXW6B-XT7PaQ6UG9lns11Y_nnap8uUKGUqo,1062
199
- cmdop-0.1.21.dist-info/RECORD,,
201
+ cmdop-0.1.23.dist-info/METADATA,sha256=3BVnbTuAgOy-U2nU1g7gpiE1n1E81AZjepAvHM1N0hA,8929
202
+ cmdop-0.1.23.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
203
+ cmdop-0.1.23.dist-info/licenses/LICENSE,sha256=6hyzbI1QVXW6B-XT7PaQ6UG9lns11Y_nnap8uUKGUqo,1062
204
+ cmdop-0.1.23.dist-info/RECORD,,
@@ -1,6 +0,0 @@
1
- """Asynchronous browser session and service."""
2
-
3
- from cmdop.services.browser.aio.session import AsyncBrowserSession
4
- from cmdop.services.browser.aio.service import AsyncBrowserService
5
-
6
- __all__ = ["AsyncBrowserSession", "AsyncBrowserService"]