webtap-tool 0.4.0__py3-none-any.whl → 0.5.1__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.

Potentially problematic release.


This version of webtap-tool might be problematic. Click here for more details.

webtap/services/main.py CHANGED
@@ -11,6 +11,7 @@ from webtap.services.fetch import FetchService
11
11
  from webtap.services.network import NetworkService
12
12
  from webtap.services.console import ConsoleService
13
13
  from webtap.services.body import BodyService
14
+ from webtap.services.dom import DOMService
14
15
 
15
16
 
16
17
  REQUIRED_DOMAINS = [
@@ -37,6 +38,7 @@ class WebTapService:
37
38
  network: Network monitoring service.
38
39
  console: Console message service.
39
40
  body: Response body fetching service.
41
+ dom: DOM inspection and element selection service.
40
42
  """
41
43
 
42
44
  def __init__(self, state):
@@ -55,17 +57,24 @@ class WebTapService:
55
57
  self.network = NetworkService()
56
58
  self.console = ConsoleService()
57
59
  self.body = BodyService()
60
+ self.dom = DOMService()
58
61
 
59
62
  self.fetch.cdp = self.cdp
60
63
  self.network.cdp = self.cdp
61
64
  self.console.cdp = self.cdp
62
65
  self.body.cdp = self.cdp
66
+ self.dom.set_cdp(self.cdp)
67
+ self.dom.set_state(self.state)
63
68
 
64
69
  self.fetch.body_service = self.body
65
70
 
66
71
  # Legacy wiring for CDP event handler
67
72
  self.cdp.fetch_service = self.fetch
68
73
 
74
+ # Register DOM event callbacks
75
+ self.cdp.register_event_callback("Overlay.inspectNodeRequested", self.dom.handle_inspect_node_requested)
76
+ self.cdp.register_event_callback("Page.frameNavigated", self.dom.handle_frame_navigated)
77
+
69
78
  @property
70
79
  def event_count(self) -> int:
71
80
  """Total count of all CDP events stored."""
@@ -108,6 +117,11 @@ class WebTapService:
108
117
  self.fetch.disable()
109
118
 
110
119
  self.body.clear_cache()
120
+ self.dom.clear_selections()
121
+
122
+ # Clear error state on disconnect
123
+ if self.state.error_state:
124
+ self.state.error_state = None
111
125
 
112
126
  self.cdp.disconnect()
113
127
  self.enabled_domains.clear()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webtap-tool
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Summary: Terminal-based web page inspector for AI debugging sessions
5
5
  Author-email: Fredrik Angelsen <fredrikangelsen@gmail.com>
6
6
  Classifier: Development Status :: 3 - Alpha
@@ -1,41 +1,42 @@
1
1
  webtap/VISION.md,sha256=kfoJfEPVc4chOrD9tNMDmYBY9rX9KB-286oZj70ALCE,7681
2
2
  webtap/__init__.py,sha256=DFWJGmqZfX8_h4csLA5pKPR4SkaHBMlUgU-WQIE96Gw,1092
3
- webtap/api.py,sha256=QLfwO_21uSyxBCsqei45c5Uyg7OVfaVopmBncx9ZRfw,8018
4
- webtap/app.py,sha256=ViWDB1Opt3Z7UMiT-p1chl3vGj8-h_WiCQdIIR05s6o,3257
3
+ webtap/api.py,sha256=twDO_aA861yjjvrKquZ0phm2SIL07Wq37DmFjtVbTw4,17990
4
+ webtap/app.py,sha256=UipzpRGS6riZxU7CgyW_eeWcB-6817P3egEO0pIdcp4,3790
5
5
  webtap/filters.py,sha256=kRCicGMSV3R_zSvwzqZqksnry6jxJNdXRcgWvpoBLfc,13323
6
6
  webtap/cdp/README.md,sha256=0TS0V_dRgRAzBqhddpXWD4S0YVi5wI4JgFJSll_KUBE,5660
7
7
  webtap/cdp/__init__.py,sha256=c6NFG0XJnAa5GTe9MLr9mDZcLZqoTQN7A1cvvOfLcgY,453
8
8
  webtap/cdp/query.py,sha256=x2Cy7KMolYkTelpROGezOfMFgYnbSlCvHkvvW1v_gLI,4229
9
- webtap/cdp/session.py,sha256=BTajmDH6nel2dvia7IX9k6C-RinkN2NxY4rxtUJAJE0,12362
9
+ webtap/cdp/session.py,sha256=LkN676_gig06w9kcXhJXZQF0z0kDZG1TTvispiYw8fQ,16212
10
10
  webtap/cdp/schema/README.md,sha256=hnWCzbXYcYtWaZb_SgjVaFBiG81S9b9Y3x-euQFwQDo,1222
11
11
  webtap/cdp/schema/cdp_protocol.json,sha256=dp9_OLYLuVsQb1oV5r6MZfMzURscBLyAXUckdaPWyv4,1488452
12
12
  webtap/cdp/schema/cdp_version.json,sha256=OhGy1qpfQjSe3Z7OqL6KynBFlDFBXxKGPZCY-ZN_lVU,399
13
- webtap/commands/DEVELOPER_GUIDE.md,sha256=lii-bOUVNBiFjpZlYIipnFNNfUI9vI5VwAhGi2jvQAU,9870
14
- webtap/commands/TIPS.md,sha256=gE75m66QxU-7RG8NS9z5EchMoEN2OrQ0ZzHMETsAd_w,6854
13
+ webtap/commands/DEVELOPER_GUIDE.md,sha256=LYOhycZ3k5EHx5nREfkjvLz7vOs8pXCRLlcDm-keWao,11973
14
+ webtap/commands/TIPS.md,sha256=LnzNHb6fhoeqEyNIhx5IOKd05nY-xCiDLCrJ5zBOmNY,8131
15
15
  webtap/commands/__init__.py,sha256=rr3xM_bY0BgxkDOjsnsI8UBhjlz7nqiYlgJ8fjiJ1jQ,270
16
- webtap/commands/_builders.py,sha256=nUZLcMWXVWx6KmEV9KLajV-Gbxv2m2NB5lNZgR5Be1c,3842
17
- webtap/commands/_errors.py,sha256=W64bGcUDsvdncD3WiL4H7hVTVE58OiwWYC391SAk43s,3400
16
+ webtap/commands/_builders.py,sha256=SYacZmZTdkolQ7OOf3rFtFPCjkukY8z020WFA-i_O_A,7902
18
17
  webtap/commands/_tips.py,sha256=SleMpwdghrHNqdzR60Cu8T0NZqJfWfcfrgIcyWI6GIQ,4793
19
18
  webtap/commands/_utils.py,sha256=VLXDhhhJITrQjwEyeLRTU2ey0QcLzY-_OxTjtPJlhYM,6816
20
- webtap/commands/body.py,sha256=e67q_rT8vtRz5_ViQjl5a6BAolW4uwedRZkVp8TJ5Vo,7111
21
- webtap/commands/connection.py,sha256=ZYV2TmK1LRVFyMneNYswJmnaoi45rFTApQew5Gm-CC0,5465
22
- webtap/commands/console.py,sha256=moGLsZ-k5wtukjrPFkEXjBl-Jj_yj4bHEArPXVmZLUc,2180
23
- webtap/commands/events.py,sha256=yx3iJgTANKsoGXBMu1WfBOjEW_thmNKMmUTXtamqRtQ,4093
24
- webtap/commands/fetch.py,sha256=_TzOvJfVzPaw4ZmyI95Qb7rS3iKx2nmp_IL3jaQO_6g,7772
19
+ webtap/commands/body.py,sha256=hJAoVU3iWBYCctPwBxVJM_xVe02TQnePB_OMTpsh1q4,7076
20
+ webtap/commands/connection.py,sha256=nvJ5k1KlyphTeVW9yJaATHo4N-hX7w62pf1-fAypSRk,5430
21
+ webtap/commands/console.py,sha256=BBaxSiLsVBChBY3Xi_nXwWjFlfc5KW9FQTPp5PzMUoE,2145
22
+ webtap/commands/events.py,sha256=dsS6xd8GfkZ4VOnAQSCMxyEvwdha9J0Kh9oeK0CaU5Y,4058
23
+ webtap/commands/fetch.py,sha256=8J6TPBWhStbkN5c5Q4KmK6nB5WiIgnAk0BkPFbh9ggg,7737
25
24
  webtap/commands/filters.py,sha256=jDZ8JcYIZv_K6aupwuAo9uqAi85e3EIKbf38BXz5nnI,10316
26
- webtap/commands/inspect.py,sha256=6PGN7iDT1oLzQJboNeYozLILrW2VsAzmtMpF3_XhD30,5746
27
- webtap/commands/javascript.py,sha256=QpQdqqoQwwTyz1lpibZ92XKOL89scu_ndgSjkhaYuDk,3195
25
+ webtap/commands/inspect.py,sha256=QonZigFYnfEVWYQY__r0n1aVvTqFBukFV-AWzc5KmfA,5711
26
+ webtap/commands/javascript.py,sha256=UHENIsnBrvWjlHU5NuU7pNWHjEnm23LZ-SXNa7Rcwu0,4879
28
27
  webtap/commands/launch.py,sha256=iZDLundKlxKRLKf3Vz5at42-tp2f-Uj5wZf7fbhBfA0,2202
29
- webtap/commands/navigation.py,sha256=Mapawp2AZTJQaws2uwlTgMUhqz7HlVTLxiZ06n_MQc0,6071
30
- webtap/commands/network.py,sha256=hli5Z0k3J_dn55IN9l72LiVs--zGWxSdLucJGTraNkY,3833
31
- webtap/commands/server.py,sha256=5WDNJGCd0Uw-SL0I02iTvC6vP1s97_5f5rEdQzx_smg,6884
28
+ webtap/commands/navigation.py,sha256=aRVW-t2YJ0Haf6Wkg7uq8GstiRftklop9W1TicUk3oo,6036
29
+ webtap/commands/network.py,sha256=gEOg_u7VF9A5aKv5myzLCuvfAUkF1OPxsuj4UAgbS44,3111
30
+ webtap/commands/selections.py,sha256=uyEET9eaKcLWjBz0QUdMRuRU-HIBXGtARxK6k71zOMY,4910
31
+ webtap/commands/server.py,sha256=DOcIgYuKp0ydwrK9EA3hGwqOwfwM9DABhdPu3hk_jjo,6948
32
32
  webtap/commands/setup.py,sha256=dov1LaN50nAEMNIuBLSK7mcnwhfn9rtqdTopBm1-PhA,9648
33
33
  webtap/services/README.md,sha256=rala_jtnNgSiQ1lFLM7x_UQ4SJZDceAm7dpkQMRTYaI,2346
34
34
  webtap/services/__init__.py,sha256=IjFqu0Ak6D-r18aokcQMtenDV3fbelvfjTCejGv6CZ0,570
35
35
  webtap/services/body.py,sha256=XQPa19y5eUc3XJ2TuwVK6kffO1VQoKqNs33MBBz7hzU,3913
36
36
  webtap/services/console.py,sha256=XVfSKTvEHyyOdujsg85S3wtj1CdZhzKtWwlx25MvSv8,3768
37
+ webtap/services/dom.py,sha256=PC-mV56NMLvw37JNzI_jOnZrM7BiDPPn3kOQI9U81vI,19067
37
38
  webtap/services/fetch.py,sha256=nl6bpU2Vnf40kau4-mqAnIkhC-7Lx2vbTJKUglz9KnE,13602
38
- webtap/services/main.py,sha256=HcXdPuI7hzsxsNvfN0npGhj_M7HObc83Lr3fuy7BMeE,5673
39
+ webtap/services/main.py,sha256=KUJFXzXL0ORlYfDV6DNULv_nzNfmlBFz_mfOvscp2wY,6287
39
40
  webtap/services/network.py,sha256=0o_--F6YvmXqqFqrcjL1gc6Vr9V1Ytb_U7r_DSUWupA,3444
40
41
  webtap/services/setup/__init__.py,sha256=lfoKCAroc-JoE_r7L-KZkF85ZWiB41MBIgrR7ZISSoE,7157
41
42
  webtap/services/setup/chrome.py,sha256=zfPWeb6zm_xjIfiS2S_O9lR2BjGKaPXXo06pN_B9lAU,7187
@@ -43,7 +44,7 @@ webtap/services/setup/desktop.py,sha256=fXwQa201W-s2mengm_dJZ9BigJopVrO9YFUQcW_T
43
44
  webtap/services/setup/extension.py,sha256=OvTLuSi5u-kBAkqWAzfYt5lTNZrduXoCMZhFCuMisew,3318
44
45
  webtap/services/setup/filters.py,sha256=lAPSLMH_KZQO-7bRkmURwzforx7C3SDrKEw2ZogN-Lo,3220
45
46
  webtap/services/setup/platform.py,sha256=7yn-7LQFffgerWzWRtOG-yNEsR36ICThYUAu_N2FAso,4532
46
- webtap_tool-0.4.0.dist-info/METADATA,sha256=NFGGGMTKNUI-nmCWUPX4Sgo0nNCbI_SDqCtE43mfXhk,17588
47
- webtap_tool-0.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
48
- webtap_tool-0.4.0.dist-info/entry_points.txt,sha256=iFe575I0CIb1MbfPt0oX2VYyY5gSU_dA551PKVR83TU,39
49
- webtap_tool-0.4.0.dist-info/RECORD,,
47
+ webtap_tool-0.5.1.dist-info/METADATA,sha256=o5Yl6gD8OVj_aOUtzHs_hPu__JjgCda9gydEvp8Wmdw,17588
48
+ webtap_tool-0.5.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
49
+ webtap_tool-0.5.1.dist-info/entry_points.txt,sha256=iFe575I0CIb1MbfPt0oX2VYyY5gSU_dA551PKVR83TU,39
50
+ webtap_tool-0.5.1.dist-info/RECORD,,
@@ -1,108 +0,0 @@
1
- """Unified error handling for WebTap commands."""
2
-
3
- from typing import Optional
4
- from replkit2.textkit import markdown
5
-
6
-
7
- ERRORS = {
8
- "not_connected": {
9
- "message": "Not connected to Chrome",
10
- "details": "Use `connect()` to connect to a page",
11
- "help": [
12
- "Run `pages()` to see available tabs",
13
- "Use `connect(0)` to connect to first tab",
14
- "Or `connect(page_id='...')` for specific tab",
15
- ],
16
- },
17
- "fetch_disabled": {
18
- "message": "Fetch interception not enabled",
19
- "details": "Enable with `fetch(enable=True)` to pause requests",
20
- },
21
- "no_data": {"message": "No data available", "details": "The requested data is not available"},
22
- }
23
-
24
-
25
- def check_connection(state) -> Optional[dict]:
26
- """Check CDP connection and return error response if not connected.
27
-
28
- Args:
29
- state: Application state containing CDP session.
30
- """
31
- if not (state.cdp and state.cdp.is_connected):
32
- return error_response("not_connected")
33
- return None
34
-
35
-
36
- def error_response(error_key: str, custom_message: str | None = None, **kwargs) -> dict:
37
- """Build consistent error response in markdown.
38
-
39
- Args:
40
- error_key: Key from error templates or custom identifier.
41
- custom_message: Override default message.
42
- **kwargs: Additional context to add to error response.
43
- """
44
- error_info = ERRORS.get(error_key, {})
45
- message = custom_message or error_info.get("message", "Error occurred")
46
-
47
- builder = markdown().element("alert", message=message, level="error")
48
-
49
- if details := error_info.get("details"):
50
- builder.text(details)
51
-
52
- if help_items := error_info.get("help"):
53
- builder.text("**How to fix:**")
54
- builder.list_(help_items)
55
-
56
- for key, value in kwargs.items():
57
- if value:
58
- builder.text(f"_{key}: {value}_")
59
-
60
- return builder.build()
61
-
62
-
63
- def warning_response(message: str, details: str | None = None) -> dict:
64
- """Build warning response for non-fatal issues.
65
-
66
- Args:
67
- message: Warning message text.
68
- details: Additional details.
69
- """
70
- builder = markdown().element("alert", message=message, level="warning")
71
- if details:
72
- builder.text(details)
73
- return builder.build()
74
-
75
-
76
- def invalid_options_error(message: str, expected: dict = None) -> dict: # pyright: ignore[reportArgumentType]
77
- """Create error response for invalid options dict.
78
-
79
- Args:
80
- message: Error message describing the issue.
81
- expected: Optional example of expected format.
82
- """
83
- builder = markdown().element("alert", message=message, level="error")
84
-
85
- if expected:
86
- builder.text("**Expected format:**")
87
- import json
88
-
89
- builder.code_block(json.dumps(expected, indent=2), language="json")
90
-
91
- return builder.build()
92
-
93
-
94
- def missing_param_error(param: str, command: str = None) -> dict: # pyright: ignore[reportArgumentType]
95
- """Create error response for missing required parameter.
96
-
97
- Args:
98
- param: Name of the missing parameter.
99
- command: Optional command name for context.
100
- """
101
- message = f"Required parameter '{param}' not provided"
102
- if command:
103
- message = f"{command}: {message}"
104
-
105
- builder = markdown().element("alert", message=message, level="error")
106
- builder.text(f"The '{param}' parameter is required for this operation")
107
-
108
- return builder.build()