thunder-agent 0.2.0__tar.gz → 0.2.2__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 (24) hide show
  1. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/PKG-INFO +1 -1
  2. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/pyproject.toml +1 -1
  3. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder/__init__.py +1 -1
  4. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder/fingerprint.py +24 -7
  5. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder/mcp_server.py +1 -1
  6. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder_agent.egg-info/PKG-INFO +1 -1
  7. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/LICENSE +0 -0
  8. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/README.md +0 -0
  9. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/setup.cfg +0 -0
  10. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/tests/test_body.py +0 -0
  11. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/tests/test_core.py +0 -0
  12. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder/body.py +0 -0
  13. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder/captcha.py +0 -0
  14. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder/cli.py +0 -0
  15. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder/demo.py +0 -0
  16. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder/ghost.py +0 -0
  17. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder/human.py +0 -0
  18. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder/mind.py +0 -0
  19. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder/nodriver_body.py +0 -0
  20. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder_agent.egg-info/SOURCES.txt +0 -0
  21. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder_agent.egg-info/dependency_links.txt +0 -0
  22. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder_agent.egg-info/entry_points.txt +0 -0
  23. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder_agent.egg-info/requires.txt +0 -0
  24. {thunder_agent-0.2.0 → thunder_agent-0.2.2}/thunder_agent.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: thunder-agent
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Thunder — the human engine for AI agents: stealth browser body, human hands, TLS ghost, CAPTCHA bridge, and a stewmind thought layer.
5
5
  Author-email: Emmanuel Ene Rejoice <emmanuelerogian723@gmail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "thunder-agent"
7
- version = "0.2.0"
7
+ version = "0.2.2"
8
8
  description = "Thunder — the human engine for AI agents: stealth browser body, human hands, TLS ghost, CAPTCHA bridge, and a stewmind thought layer."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -24,5 +24,5 @@ from thunder.ghost import Ghost
24
24
  from thunder.mind import StewMind
25
25
  from thunder.fingerprint import Skin, random_skin
26
26
 
27
- __version__ = "0.2.0"
27
+ __version__ = "0.2.2"
28
28
  __all__ = ["Body", "Ghost", "StewMind", "Skin", "random_skin", "NodriverBody", "__version__"]
@@ -74,17 +74,34 @@ class Skin:
74
74
  try { Object.defineProperty(obj, prop, {get: () => value, configurable: true}); }
75
75
  catch (e) {}
76
76
  };
77
- def(navigator, 'webdriver', undefined); // the classic tell
77
+ // the classic tell, erased at prototype level:
78
+ // Chrome defines navigator.webdriver as an ENUMERABLE property on
79
+ // Navigator.prototype, so for-in scans (Intoli/CreepJS style) find it
80
+ // even when its value is undefined. Redefine non-enumerable + hide.
81
+ try {
82
+ Object.defineProperty(Object.getPrototypeOf(navigator), 'webdriver', {
83
+ get: () => undefined, set: undefined, configurable: true, enumerable: false
84
+ });
85
+ } catch (e) {}
86
+ try { delete navigator.webdriver; } catch (e) {}
78
87
  def(navigator, 'platform', SKIN.platform);
79
88
  def(navigator, 'languages', SKIN.languages);
80
89
  def(navigator, 'hardwareConcurrency', SKIN.hardware_concurrency);
81
90
  def(navigator, 'deviceMemory', SKIN.device_memory);
82
- def(navigator, 'plugins', [
83
- {name:'Chrome PDF Plugin', filename:'internal-pdf-viewer'},
84
- {name:'Chrome PDF Viewer', filename:'mhjfbmdgcfjbbpaeojofohoefgiehjal'},
85
- {name:'Chromium PDF Viewer', filename:'internal-pdf-viewer'},
86
- {name:'Microsoft Edge PDF Plugin', filename:'internal-pdf-viewer'},
87
- {name:'WebKit built-in PDF', filename:'internal-pdf-viewer'}]);
91
+ // plugins: KEEP the genuine PluginArray when the browser already has a
92
+ // human-plausible one (real Chrome does). Only fabricate if it is empty
93
+ // or not a real PluginArray (headless shells) — detectors check typeof.
94
+ try {
95
+ if (!navigator.plugins || !(navigator.plugins instanceof PluginArray) ||
96
+ navigator.plugins.length === 0) {
97
+ def(navigator, 'plugins', [
98
+ {name:'Chrome PDF Plugin', filename:'internal-pdf-viewer'},
99
+ {name:'Chrome PDF Viewer', filename:'mhjfbmdgcfjbbpaeojofohoefgiehjal'},
100
+ {name:'Chromium PDF Viewer', filename:'internal-pdf-viewer'},
101
+ {name:'Microsoft Edge PDF Plugin', filename:'internal-pdf-viewer'},
102
+ {name:'WebKit built-in PDF', filename:'internal-pdf-viewer'}]);
103
+ }
104
+ } catch (e) {}
88
105
  def(screen, 'width', SKIN.screen_w);
89
106
  def(screen, 'height', SKIN.screen_h);
90
107
  def(screen, 'availWidth', SKIN.screen_w);
@@ -173,7 +173,7 @@ async def serve_stdio():
173
173
  send({"jsonrpc": "2.0", "id": rid, "result": {
174
174
  "protocolVersion": "2024-11-05",
175
175
  "capabilities": {"tools": {}},
176
- "serverInfo": {"name": "thunder", "version": "0.1.0"}}})
176
+ "serverInfo": {"name": "thunder", "version": __import__("thunder").__version__}}})
177
177
  elif method == "notifications/initialized":
178
178
  continue
179
179
  elif method == "tools/list":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: thunder-agent
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Thunder — the human engine for AI agents: stealth browser body, human hands, TLS ghost, CAPTCHA bridge, and a stewmind thought layer.
5
5
  Author-email: Emmanuel Ene Rejoice <emmanuelerogian723@gmail.com>
6
6
  License: MIT
File without changes
File without changes
File without changes