sentienceapi 0.90.16__py3-none-any.whl → 0.98.0__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 sentienceapi might be problematic. Click here for more details.

Files changed (90) hide show
  1. sentience/__init__.py +120 -6
  2. sentience/_extension_loader.py +156 -1
  3. sentience/action_executor.py +217 -0
  4. sentience/actions.py +758 -30
  5. sentience/agent.py +806 -293
  6. sentience/agent_config.py +3 -0
  7. sentience/agent_runtime.py +840 -0
  8. sentience/asserts/__init__.py +70 -0
  9. sentience/asserts/expect.py +621 -0
  10. sentience/asserts/query.py +383 -0
  11. sentience/async_api.py +89 -1141
  12. sentience/backends/__init__.py +137 -0
  13. sentience/backends/actions.py +372 -0
  14. sentience/backends/browser_use_adapter.py +241 -0
  15. sentience/backends/cdp_backend.py +393 -0
  16. sentience/backends/exceptions.py +211 -0
  17. sentience/backends/playwright_backend.py +194 -0
  18. sentience/backends/protocol.py +216 -0
  19. sentience/backends/sentience_context.py +469 -0
  20. sentience/backends/snapshot.py +483 -0
  21. sentience/base_agent.py +95 -0
  22. sentience/browser.py +678 -39
  23. sentience/browser_evaluator.py +299 -0
  24. sentience/canonicalization.py +207 -0
  25. sentience/cloud_tracing.py +507 -42
  26. sentience/constants.py +6 -0
  27. sentience/conversational_agent.py +77 -43
  28. sentience/cursor_policy.py +142 -0
  29. sentience/element_filter.py +136 -0
  30. sentience/expect.py +98 -2
  31. sentience/extension/background.js +56 -185
  32. sentience/extension/content.js +150 -287
  33. sentience/extension/injected_api.js +1088 -1368
  34. sentience/extension/manifest.json +1 -1
  35. sentience/extension/pkg/sentience_core.d.ts +22 -22
  36. sentience/extension/pkg/sentience_core.js +275 -433
  37. sentience/extension/pkg/sentience_core_bg.wasm +0 -0
  38. sentience/extension/release.json +47 -47
  39. sentience/failure_artifacts.py +241 -0
  40. sentience/formatting.py +9 -53
  41. sentience/inspector.py +183 -1
  42. sentience/integrations/__init__.py +6 -0
  43. sentience/integrations/langchain/__init__.py +12 -0
  44. sentience/integrations/langchain/context.py +18 -0
  45. sentience/integrations/langchain/core.py +326 -0
  46. sentience/integrations/langchain/tools.py +180 -0
  47. sentience/integrations/models.py +46 -0
  48. sentience/integrations/pydanticai/__init__.py +15 -0
  49. sentience/integrations/pydanticai/deps.py +20 -0
  50. sentience/integrations/pydanticai/toolset.py +468 -0
  51. sentience/llm_interaction_handler.py +191 -0
  52. sentience/llm_provider.py +765 -66
  53. sentience/llm_provider_utils.py +120 -0
  54. sentience/llm_response_builder.py +153 -0
  55. sentience/models.py +595 -3
  56. sentience/ordinal.py +280 -0
  57. sentience/overlay.py +109 -2
  58. sentience/protocols.py +228 -0
  59. sentience/query.py +67 -5
  60. sentience/read.py +95 -3
  61. sentience/recorder.py +223 -3
  62. sentience/schemas/trace_v1.json +128 -9
  63. sentience/screenshot.py +48 -2
  64. sentience/sentience_methods.py +86 -0
  65. sentience/snapshot.py +599 -55
  66. sentience/snapshot_diff.py +126 -0
  67. sentience/text_search.py +120 -5
  68. sentience/trace_event_builder.py +148 -0
  69. sentience/trace_file_manager.py +197 -0
  70. sentience/trace_indexing/index_schema.py +95 -7
  71. sentience/trace_indexing/indexer.py +105 -48
  72. sentience/tracer_factory.py +120 -9
  73. sentience/tracing.py +172 -8
  74. sentience/utils/__init__.py +40 -0
  75. sentience/utils/browser.py +46 -0
  76. sentience/{utils.py → utils/element.py} +3 -42
  77. sentience/utils/formatting.py +59 -0
  78. sentience/verification.py +618 -0
  79. sentience/visual_agent.py +2058 -0
  80. sentience/wait.py +68 -2
  81. {sentienceapi-0.90.16.dist-info → sentienceapi-0.98.0.dist-info}/METADATA +199 -40
  82. sentienceapi-0.98.0.dist-info/RECORD +92 -0
  83. sentience/extension/test-content.js +0 -4
  84. sentienceapi-0.90.16.dist-info/RECORD +0 -50
  85. {sentienceapi-0.90.16.dist-info → sentienceapi-0.98.0.dist-info}/WHEEL +0 -0
  86. {sentienceapi-0.90.16.dist-info → sentienceapi-0.98.0.dist-info}/entry_points.txt +0 -0
  87. {sentienceapi-0.90.16.dist-info → sentienceapi-0.98.0.dist-info}/licenses/LICENSE +0 -0
  88. {sentienceapi-0.90.16.dist-info → sentienceapi-0.98.0.dist-info}/licenses/LICENSE-APACHE +0 -0
  89. {sentienceapi-0.90.16.dist-info → sentienceapi-0.98.0.dist-info}/licenses/LICENSE-MIT +0 -0
  90. {sentienceapi-0.90.16.dist-info → sentienceapi-0.98.0.dist-info}/top_level.txt +0 -0
sentience/wait.py CHANGED
@@ -1,13 +1,16 @@
1
+ from typing import Optional
2
+
1
3
  """
2
4
  Wait functionality - wait_for element matching selector
3
5
  """
4
6
 
7
+ import asyncio
5
8
  import time
6
9
 
7
- from .browser import SentienceBrowser
10
+ from .browser import AsyncSentienceBrowser, SentienceBrowser
8
11
  from .models import SnapshotOptions, WaitResult
9
12
  from .query import find
10
- from .snapshot import snapshot
13
+ from .snapshot import snapshot, snapshot_async
11
14
 
12
15
 
13
16
  def wait_for(
@@ -71,3 +74,66 @@ def wait_for(
71
74
  duration_ms=duration_ms,
72
75
  timeout=True,
73
76
  )
77
+
78
+
79
+ async def wait_for_async(
80
+ browser: AsyncSentienceBrowser,
81
+ selector: str | dict,
82
+ timeout: float = 10.0,
83
+ interval: float | None = None,
84
+ use_api: bool | None = None,
85
+ ) -> WaitResult:
86
+ """
87
+ Wait for element matching selector to appear (async)
88
+
89
+ Args:
90
+ browser: AsyncSentienceBrowser instance
91
+ selector: String DSL or dict query
92
+ timeout: Maximum time to wait (seconds)
93
+ interval: Polling interval (seconds). If None, auto-detects:
94
+ - 0.25s for local extension (use_api=False, fast)
95
+ - 1.5s for remote API (use_api=True or default, network latency)
96
+ use_api: Force use of server-side API if True, local extension if False.
97
+ If None, uses API if api_key is set, otherwise uses local extension.
98
+
99
+ Returns:
100
+ WaitResult
101
+ """
102
+ # Auto-detect optimal interval based on API usage
103
+ if interval is None:
104
+ # Determine if using API
105
+ will_use_api = use_api if use_api is not None else (browser.api_key is not None)
106
+ if will_use_api:
107
+ interval = 1.5 # Longer interval for API calls (network latency)
108
+ else:
109
+ interval = 0.25 # Shorter interval for local extension (fast)
110
+
111
+ start_time = time.time()
112
+
113
+ while time.time() - start_time < timeout:
114
+ # Take snapshot (may be local extension or remote API)
115
+ snap = await snapshot_async(browser, SnapshotOptions(use_api=use_api))
116
+
117
+ # Try to find element
118
+ element = find(snap, selector)
119
+
120
+ if element:
121
+ duration_ms = int((time.time() - start_time) * 1000)
122
+ return WaitResult(
123
+ found=True,
124
+ element=element,
125
+ duration_ms=duration_ms,
126
+ timeout=False,
127
+ )
128
+
129
+ # Wait before next poll
130
+ await asyncio.sleep(interval)
131
+
132
+ # Timeout
133
+ duration_ms = int((time.time() - start_time) * 1000)
134
+ return WaitResult(
135
+ found=False,
136
+ element=None,
137
+ duration_ms=duration_ms,
138
+ timeout=True,
139
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sentienceapi
3
- Version: 0.90.16
3
+ Version: 0.98.0
4
4
  Summary: Python SDK for Sentience AI Agent Browser Automation
5
5
  Author: Sentience Team
6
6
  License: MIT OR Apache-2.0
@@ -23,8 +23,23 @@ Requires-Dist: playwright>=1.40.0
23
23
  Requires-Dist: pydantic>=2.0.0
24
24
  Requires-Dist: jsonschema>=4.0.0
25
25
  Requires-Dist: requests>=2.31.0
26
+ Requires-Dist: httpx>=0.25.0
26
27
  Requires-Dist: playwright-stealth>=1.0.6
27
28
  Requires-Dist: markdownify>=0.11.6
29
+ Provides-Extra: browser-use
30
+ Requires-Dist: browser-use>=0.1.40; extra == "browser-use"
31
+ Provides-Extra: pydanticai
32
+ Requires-Dist: pydantic-ai; extra == "pydanticai"
33
+ Provides-Extra: langchain
34
+ Requires-Dist: langchain; extra == "langchain"
35
+ Requires-Dist: langgraph; extra == "langchain"
36
+ Provides-Extra: vision-local
37
+ Requires-Dist: pillow>=10.0.0; extra == "vision-local"
38
+ Requires-Dist: torch>=2.2.0; extra == "vision-local"
39
+ Requires-Dist: transformers>=4.46.0; extra == "vision-local"
40
+ Provides-Extra: mlx-vlm
41
+ Requires-Dist: pillow>=10.0.0; extra == "mlx-vlm"
42
+ Requires-Dist: mlx-vlm>=0.1.0; extra == "mlx-vlm"
28
43
  Provides-Extra: dev
29
44
  Requires-Dist: pytest>=7.0.0; extra == "dev"
30
45
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
@@ -32,7 +47,7 @@ Dynamic: license-file
32
47
 
33
48
  # Sentience Python SDK
34
49
 
35
- **Semantic geometry grounding for deterministic, debuggable AI web agents with time-travel traces.**
50
+ **Semantic snapshots and Jest-style assertions for reliable AI web agents with time-travel traces**
36
51
 
37
52
  ## 📦 Installation
38
53
 
@@ -54,6 +69,106 @@ pip install transformers torch # For local LLMs
54
69
  pip install -e .
55
70
  ```
56
71
 
72
+ ## Jest for AI Web Agent
73
+
74
+ ### Semantic snapshots and assertions that let agents act, verify, and know when they're done.
75
+
76
+ Use `AgentRuntime` to add Jest-style assertions to your agent loops. Verify browser state, check task completion, and get clear feedback on what's working:
77
+
78
+ ```python
79
+ import asyncio
80
+ from sentience import AsyncSentienceBrowser, AgentRuntime
81
+ from sentience.verification import (
82
+ url_contains,
83
+ exists,
84
+ all_of,
85
+ is_enabled,
86
+ is_checked,
87
+ value_equals,
88
+ )
89
+ from sentience.tracing import Tracer, JsonlTraceSink
90
+
91
+ async def main():
92
+ # Create tracer
93
+ tracer = Tracer(run_id="my-run", sink=JsonlTraceSink("trace.jsonl"))
94
+
95
+ # Create browser and runtime
96
+ async with AsyncSentienceBrowser() as browser:
97
+ page = await browser.new_page()
98
+ runtime = await AgentRuntime.from_sentience_browser(
99
+ browser=browser,
100
+ page=page,
101
+ tracer=tracer
102
+ )
103
+
104
+ # Navigate and take snapshot
105
+ await page.goto("https://example.com")
106
+ runtime.begin_step("Verify page loaded")
107
+ await runtime.snapshot()
108
+
109
+ # v1: deterministic assertions (Jest-style)
110
+ runtime.assert_(url_contains("example.com"), label="on_correct_domain")
111
+ runtime.assert_(exists("role=heading"), label="has_heading")
112
+ runtime.assert_(all_of([
113
+ exists("role=button"),
114
+ exists("role=link")
115
+ ]), label="has_interactive_elements")
116
+
117
+ # v1: state-aware assertions (when Gateway refinement is enabled)
118
+ runtime.assert_(is_enabled("role=button"), label="button_enabled")
119
+ runtime.assert_(is_checked("role=checkbox name~'subscribe'"), label="subscribe_checked_if_present")
120
+ runtime.assert_(value_equals("role=textbox name~'email'", "user@example.com"), label="email_value_if_present")
121
+
122
+ # v2: retry loop with snapshot confidence gating + exhaustion
123
+ ok = await runtime.check(
124
+ exists("role=heading"),
125
+ label="heading_eventually_visible",
126
+ required=True,
127
+ ).eventually(timeout_s=10.0, poll_s=0.25, min_confidence=0.7, max_snapshot_attempts=3)
128
+ print("eventually() result:", ok)
129
+
130
+ # Check task completion
131
+ if runtime.assert_done(exists("text~'Example'"), label="task_complete"):
132
+ print("✅ Task completed!")
133
+
134
+ print(f"Task done: {runtime.is_task_done}")
135
+
136
+ asyncio.run(main())
137
+ ```
138
+
139
+ ### Failure Artifact Buffer (Phase 1)
140
+
141
+ Capture a short ring buffer of screenshots and persist them when a required assertion fails.
142
+
143
+ ```python
144
+ from sentience.failure_artifacts import FailureArtifactsOptions
145
+
146
+ await runtime.enable_failure_artifacts(
147
+ FailureArtifactsOptions(buffer_seconds=15, capture_on_action=True, fps=0.0)
148
+ )
149
+
150
+ # After each action, record it (best-effort).
151
+ await runtime.record_action("CLICK")
152
+ ```
153
+
154
+ ### Redaction callback (Phase 3)
155
+
156
+ Provide a user-defined callback to redact snapshots and decide whether to persist frames. The SDK does not implement image/video redaction.
157
+
158
+ ```python
159
+ from sentience.failure_artifacts import FailureArtifactsOptions, RedactionContext, RedactionResult
160
+
161
+ def redact(ctx: RedactionContext) -> RedactionResult:
162
+ # Example: drop frames entirely, keep JSON only.
163
+ return RedactionResult(drop_frames=True)
164
+
165
+ await runtime.enable_failure_artifacts(
166
+ FailureArtifactsOptions(on_before_persist=redact)
167
+ )
168
+ ```
169
+
170
+ **See examples:** [`examples/asserts/`](examples/asserts/)
171
+
57
172
  ## 🚀 Quick Start: Choose Your Abstraction Level
58
173
 
59
174
  Sentience SDK offers **three abstraction levels** - use what fits your needs:
@@ -134,56 +249,66 @@ with SentienceBrowser(headless=False) as browser:
134
249
 
135
250
  ---
136
251
 
137
- <details>
138
- <summary><h2>💼 Real-World Example: Amazon Shopping Bot</h2></summary>
252
+ ## 🆕 What's New (2026-01-06)
253
+
254
+ ### Human-like Typing
255
+ Add realistic delays between keystrokes to mimic human typing:
256
+ ```python
257
+ from sentience import type_text
139
258
 
140
- This example demonstrates navigating Amazon, finding products, and adding items to cart:
259
+ # Type instantly (default)
260
+ type_text(browser, element_id, "Hello World")
141
261
 
262
+ # Type with human-like delay (~10ms between keystrokes)
263
+ type_text(browser, element_id, "Hello World", delay_ms=10)
264
+ ```
265
+
266
+ ### Scroll to Element
267
+ Scroll elements into view with smooth animation:
142
268
  ```python
143
- from sentience import SentienceBrowser, snapshot, find, click
144
- import time
269
+ from sentience import snapshot, find, scroll_to
145
270
 
146
- with SentienceBrowser(headless=False) as browser:
147
- # Navigate to Amazon Best Sellers
148
- browser.goto("https://www.amazon.com/gp/bestsellers/", wait_until="domcontentloaded")
149
- time.sleep(2) # Wait for dynamic content
271
+ snap = snapshot(browser)
272
+ button = find(snap, 'role=button text~"Submit"')
150
273
 
151
- # Take snapshot and find products
152
- snap = snapshot(browser)
153
- print(f"Found {len(snap.elements)} elements")
274
+ # Scroll element into view with smooth animation
275
+ scroll_to(browser, button.id)
154
276
 
155
- # Find first product in viewport using spatial filtering
156
- products = [
157
- el for el in snap.elements
158
- if el.role == "link"
159
- and el.visual_cues.is_clickable
160
- and el.in_viewport
161
- and not el.is_occluded
162
- and el.bbox.y < 600 # First row
163
- ]
277
+ # Scroll instantly to top of viewport
278
+ scroll_to(browser, button.id, behavior='instant', block='start')
279
+ ```
164
280
 
165
- if products:
166
- # Sort by position (left to right, top to bottom)
167
- products.sort(key=lambda e: (e.bbox.y, e.bbox.x))
168
- first_product = products[0]
281
+ ---
169
282
 
170
- print(f"Clicking: {first_product.text}")
171
- result = click(browser, first_product.id)
283
+ <details>
284
+ <summary><h2>💼 Real-World Example: Assertion-driven navigation</h2></summary>
172
285
 
173
- # Wait for product page
174
- browser.page.wait_for_load_state("networkidle")
175
- time.sleep(2)
286
+ This example shows how to use **assertions + `.eventually()`** to make an agent loop resilient:
176
287
 
177
- # Find and click "Add to Cart" button
178
- product_snap = snapshot(browser)
179
- add_to_cart = find(product_snap, "role=button text~'add to cart'")
288
+ ```python
289
+ import asyncio
290
+ import os
291
+ from sentience import AsyncSentienceBrowser, AgentRuntime
292
+ from sentience.tracing import Tracer, JsonlTraceSink
293
+ from sentience.verification import url_contains, exists
180
294
 
181
- if add_to_cart:
182
- cart_result = click(browser, add_to_cart.id)
183
- print(f"Added to cart: {cart_result.success}")
184
- ```
295
+ async def main():
296
+ tracer = Tracer(run_id="verified-run", sink=JsonlTraceSink("trace_verified.jsonl"))
297
+ async with AsyncSentienceBrowser(headless=True) as browser:
298
+ page = await browser.new_page()
299
+ runtime = await AgentRuntime.from_sentience_browser(browser=browser, page=page, tracer=tracer)
300
+ runtime.sentience_api_key = os.getenv("SENTIENCE_API_KEY") # optional, enables Gateway diagnostics
301
+
302
+ await page.goto("https://example.com")
303
+ runtime.begin_step("Verify we're on the right page")
185
304
 
186
- **📖 See the complete tutorial:** [Amazon Shopping Guide](../docs/AMAZON_SHOPPING_GUIDE.md)
305
+ await runtime.check(url_contains("example.com"), label="on_domain", required=True).eventually(
306
+ timeout_s=10.0, poll_s=0.25, min_confidence=0.7, max_snapshot_attempts=3
307
+ )
308
+ runtime.assert_(exists("role=heading"), label="heading_present")
309
+
310
+ asyncio.run(main())
311
+ ```
187
312
 
188
313
  </details>
189
314
 
@@ -831,6 +956,40 @@ with browser:
831
956
 
832
957
  </details>
833
958
 
959
+ <details>
960
+ <summary><h3>🔍 Agent Runtime Verification</h3></summary>
961
+
962
+ `AgentRuntime` provides assertion predicates for runtime verification in agent loops, enabling programmatic verification of browser state during execution.
963
+
964
+ ```python
965
+ from sentience import (
966
+ AgentRuntime, SentienceBrowser,
967
+ url_contains, exists, all_of
968
+ )
969
+ from sentience.tracer_factory import create_tracer
970
+
971
+ browser = SentienceBrowser()
972
+ browser.start()
973
+ tracer = create_tracer(run_id="my-run", upload_trace=False)
974
+ runtime = AgentRuntime(browser, browser.page, tracer)
975
+
976
+ # Navigate and take snapshot
977
+ browser.page.goto("https://example.com")
978
+ runtime.begin_step("Verify page")
979
+ runtime.snapshot()
980
+
981
+ # Run assertions
982
+ runtime.assert_(url_contains("example.com"), "on_correct_domain")
983
+ runtime.assert_(exists("role=heading"), "has_heading")
984
+ runtime.assert_done(exists("text~'Example'"), "task_complete")
985
+
986
+ print(f"Task done: {runtime.is_task_done}")
987
+ ```
988
+
989
+ **See example:** [`examples/agent_runtime_verification.py`](examples/agent_runtime_verification.py)
990
+
991
+ </details>
992
+
834
993
  <details>
835
994
  <summary><h3>🧰 Snapshot Utilities</h3></summary>
836
995
 
@@ -0,0 +1,92 @@
1
+ sentience/__init__.py,sha256=ZzolJfPqb2vnvBwrv7G7MgYJqrB8RuQ1VZsYCK4mgGY,6607
2
+ sentience/_extension_loader.py,sha256=z99Kvwh0bbFEbH04-LJ52t6kIpK9_hh1HG_QBdRg7e4,6118
3
+ sentience/action_executor.py,sha256=8ESWrFPvRDs5pp7Yvih7wkb_-8aY3kL0Ssr0KHRp-ZE,8226
4
+ sentience/actions.py,sha256=UUpmCKxws9tU_ppgITu4-nqUI0piFEkqGV9s_afrf-A,38382
5
+ sentience/agent.py,sha256=xcZ6gRucZRN0La3v5Y6jJRH2js8tgKx4qdwjcgfYVxs,49158
6
+ sentience/agent_config.py,sha256=n6HohW5j4VK3kT23xW7x2Vfz7HvEheb9g4AZ3VWfPpg,1588
7
+ sentience/agent_runtime.py,sha256=ak5CU6X-ig_mvwyt6lNV10XMh7lizlz0qeC97_xJ3Y8,30535
8
+ sentience/async_api.py,sha256=Wh2fE8SQ_9wpCPUyqpMubPbmuzzf83H_ncw21QUnTS8,4077
9
+ sentience/base_agent.py,sha256=5yVXe0S72I7GV4NPYySTvHfUAFvHBD4VjsNKSTo8MFo,5786
10
+ sentience/browser.py,sha256=B6UprJYyIcK4UFdxF8b8BhKwcuivgpwujcqgLK0qDBk,52937
11
+ sentience/browser_evaluator.py,sha256=CRiMsutM68dZWHnMIrFzpVzrkUwxVsXpjBplSIWCkso,9772
12
+ sentience/canonicalization.py,sha256=C7pkxaSgnCI0j_8oZ66yTQu6DGBCTM233IavjhSZgjA,6416
13
+ sentience/cli.py,sha256=R95DgCSJmezuymAdfL6fzUdB1HpCF3iMWcLO73KJ8eY,3851
14
+ sentience/cloud_tracing.py,sha256=ghhgDh9gqF1igEtmlAIFkRsSM7iVQanNhmOsJYhnDCk,32542
15
+ sentience/constants.py,sha256=sGiG_-gnchIW0maA0K9cVaq1-TAkwV4GyEW3kZ_6bhE,110
16
+ sentience/conversational_agent.py,sha256=v3FXczfNZdizQA7ejfgEbhGq_zaOboGb3__UaW7Alpo,18551
17
+ sentience/cursor_policy.py,sha256=36RsH387Y0EMj70_hMNLS6NdVbes6FEIcyB4hWtsypk,4137
18
+ sentience/element_filter.py,sha256=aVFrbTDkH-gtMZt07QfBZH3Oq8_KzwQMz17PD1uQ1h0,4021
19
+ sentience/expect.py,sha256=JIhHJ_UGiPvKWbX5SOmX1irOZlko5N5hhhX6d2Ymem0,6177
20
+ sentience/failure_artifacts.py,sha256=aMbAAZt06MJtCwxJSUw8U9REhUSWXR_j1OcVtzcg66g,7938
21
+ sentience/formatting.py,sha256=rptVpktftZZa5YJu4H2-K5dL8pzdIaPO9ONlEGSWnQw,483
22
+ sentience/generator.py,sha256=Wj--yn6bVo02nABBzrAIKPMmU8TRQm3JHAOER9XXT4Y,8035
23
+ sentience/inspector.py,sha256=D4q_GqXUCV3nUJv8uDv2novDbgnkboHOc9ahGeSYw9Q,14562
24
+ sentience/llm_interaction_handler.py,sha256=elvNtmGwIvoRcdra_fvijSONWzhztgdDmuPFJF2Whkw,7218
25
+ sentience/llm_provider.py,sha256=NZjJOPgbIhTSEzVceCA45-ZTleNzt3R4wTwH3_5_xyA,45685
26
+ sentience/llm_provider_utils.py,sha256=Hkr30MzZ5AvROJxEZHW97FINklzU9xoV8lITUQRoFls,3854
27
+ sentience/llm_response_builder.py,sha256=9lKJcfvD2EY7XcJtTYWTLYkxMVv_6nvlKTcGCO1nB2Q,4935
28
+ sentience/models.py,sha256=Je9Hk_9AOo1L0gFNFgIMT_a4DjxQqST1XPqt4raqq1c,38358
29
+ sentience/ordinal.py,sha256=E6XKLiGPhwavsWOghWwsG00JxOupF5bJnwJ9ctF3rP0,9048
30
+ sentience/overlay.py,sha256=awphkU0ZvkQrxSwQz7S8rvc3gQIqrDhztcQzzjEnR2c,7738
31
+ sentience/protocols.py,sha256=jXAa-RTxdIlMgISxTlIC8P79JqoD4i5T-cjbtgLjuUk,5667
32
+ sentience/query.py,sha256=Dx_OU8gm1BS-Vl9Ks3StLeuGCuZe99D_abzo8kVkNGU,12869
33
+ sentience/read.py,sha256=W0VSh9aBaIOMfUBcmjFubN1Ax1TmpCF1E74SLensy-g,7109
34
+ sentience/recorder.py,sha256=6cJVmjTT7HpRaet6KvdpTFAPVwFmD30eXHtbAKdwoUw,20636
35
+ sentience/screenshot.py,sha256=BJTPsIeE8irP1bhj4Vti2ohsZn5RkkGFTaZJOB855Pk,3147
36
+ sentience/sentience_methods.py,sha256=NmWmf_xfDt8t6RJs5Gf317EDBDrLcOUmHjDhrGpr4ws,2552
37
+ sentience/snapshot.py,sha256=1awUnAmxumo7us_-lYGkHHJh3aqqNzyGTlGPVIcJ6kU,29593
38
+ sentience/snapshot_diff.py,sha256=eh0PAl4PGsfAK8H0JopyQ-WwtPpV24BYV5t_sBqBs18,4716
39
+ sentience/text_search.py,sha256=MIKNn9PG-P4-L_0SzBB5F6O9KM9dzEKB4vRa4wPqoBw,10597
40
+ sentience/trace_event_builder.py,sha256=oj8Wb7mbWwoKRwzRivyVWiBXjy3G2SRMiYX0EaNUmBg,5025
41
+ sentience/trace_file_manager.py,sha256=JxvCx-Hzfyy0wP0DHo9JPnrmFNGtLvdCrPfk0mGiqmE,6311
42
+ sentience/tracer_factory.py,sha256=89gkYF5dTFw44_Db_FKm4vcrSaYhwzhr1jRk13MdnWc,12873
43
+ sentience/tracing.py,sha256=48J-vmtfhXjrJ4UB3i_oHbBmcKs5UsJ8ixfK3MrMt_Q,13885
44
+ sentience/verification.py,sha256=MADOKXSj4MjAmpD8DF6VUyW9UBBv-R2GJF9M-B8s8JM,18571
45
+ sentience/visual_agent.py,sha256=jdBC2YAckJWM2gE2bCW_6-3GXHsmY-CF7sryqyWuWgc,83054
46
+ sentience/wait.py,sha256=sx-87AN1TO_f8UbNP9np8zA0t27zQzQg2c2TltOn2h0,4373
47
+ sentience/asserts/__init__.py,sha256=73TN2aAGrgOkz_wakG4hcd9Cy69MF_3fRWiSFvFh-0o,1898
48
+ sentience/asserts/expect.py,sha256=IXf9yUSVDVFhSwfDGZqKb0raRyvBRkL4PtiWVI27lf4,20831
49
+ sentience/asserts/query.py,sha256=DPnHxEcY8-PenSqd-9J_Kmert3j5ri8xIqYigCwAlvM,11752
50
+ sentience/backends/__init__.py,sha256=HMEqcdp3mYfXYJwO4am4ndlCiRYIVCXcWOJR-OvU2Ic,4040
51
+ sentience/backends/actions.py,sha256=HTJy3xqSH6aZgSMVED5cW5hkCdiNNs_01fp1qo8Jawg,11637
52
+ sentience/backends/browser_use_adapter.py,sha256=bFb1PkPoZws4Ykq08a_ChK2Ms-Xobg94xCmEUmeGJDc,8066
53
+ sentience/backends/cdp_backend.py,sha256=sZJuOpSEhKTfGftbHMglja6AhuXUYlv_-eZS4pi9OY8,12674
54
+ sentience/backends/exceptions.py,sha256=vbvVn62HflMLPOc3YT8SngmjxPTLNL4VoE0eBLDO9cw,6687
55
+ sentience/backends/playwright_backend.py,sha256=XWBxFDGhIWJ6StzKdWNAxDP5aqTW7dzo74JN_qUfUOQ,6707
56
+ sentience/backends/protocol.py,sha256=sL11XDFUnxB-87RdWpN2266Z4WYxv74m1DH-Vsen3-k,5599
57
+ sentience/backends/sentience_context.py,sha256=0fAEpuK-YvD_tlqI0as-sIOXOoIoqFFY14rS1vTAT_w,16689
58
+ sentience/backends/snapshot.py,sha256=YAxaYH3dwaikrMswbhWGsncnBdWUV7lRY2n-oPCfKJo,15476
59
+ sentience/extension/background.js,sha256=Om-Wsu-DP0gjKILWjysW7le_BOCKm5YugUuuTMuic14,3754
60
+ sentience/extension/content.js,sha256=zdVveMeX_2bMupuzehSeAR5xtFzhMRC78hUn0O1oXmA,11249
61
+ sentience/extension/injected_api.js,sha256=pb6CGee5e1r9-DwEMWLsugSH7FpGOL-fxwV1nYpTY-w,66861
62
+ sentience/extension/manifest.json,sha256=FFaImjuIKdON9238WF5YypoPLJn_iWD6BaAt5dRIdvo,897
63
+ sentience/extension/release.json,sha256=w7c7qnB9HfqCgCoONOXkeiw1wSVVOpU484VPKczrQdc,6141
64
+ sentience/extension/pkg/sentience_core.d.ts,sha256=E_rJXQknWuU_8m5Nmt7buXy2J20bvMjBzIir31NBi8U,2011
65
+ sentience/extension/pkg/sentience_core.js,sha256=cUkeYs5FwGkFQ6l5zVWeEdSecFcSd4lAc-JC79DK13U,14623
66
+ sentience/extension/pkg/sentience_core_bg.wasm,sha256=drEsNRJ_s1OlU5CfJV6t_6fIHQggVQ2tl_9iPXmiVM4,112142
67
+ sentience/extension/pkg/sentience_core_bg.wasm.d.ts,sha256=O3c3HaUqmB6Aob6Pt0n3GEtTxM4VGeaClaA_-z2m2J4,517
68
+ sentience/integrations/__init__.py,sha256=TbJiIGTqpv9Bq9Kmq1img5aMlpEbfXPNnWxm5AK5H0w,221
69
+ sentience/integrations/models.py,sha256=TAcZhyvyisUcsTIihWPV1KCG2ylN2TuiwUKbvbkXDYk,1112
70
+ sentience/integrations/langchain/__init__.py,sha256=_8_fkan9_GXo-OLBUOFyUeISvtpza1w385sNQ8gK9zI,460
71
+ sentience/integrations/langchain/context.py,sha256=5iMQmANttMvnI8uuuEgUgfAPGqvgse0bYov4nvr8X-0,418
72
+ sentience/integrations/langchain/core.py,sha256=pFGJQqXkPOciC_CKymLGw0_E4_gmyPeu1tVXALbi8gw,11258
73
+ sentience/integrations/langchain/tools.py,sha256=kZ48jVl_VxSjUVVH7a9RYV2VvZu8ti72fi6NQ6zoYS4,7758
74
+ sentience/integrations/pydanticai/__init__.py,sha256=qeSnhoyAnyYQUC8ERk0FiAijPXHzf76Zpc5i5Zm64KU,464
75
+ sentience/integrations/pydanticai/deps.py,sha256=6uwsc1a2xVjMPV4grsymxLfgVmN25rDoQz4GhO7lFcw,460
76
+ sentience/integrations/pydanticai/toolset.py,sha256=J6uHHikFy5J2qjzh4BzlWL-MUVr_JBt4jb6CRhrxr0E,15378
77
+ sentience/schemas/trace_v1.json,sha256=qhMtb8PcuUwFSmuetkvKFcVOc7fcUpNvun372O6f12E,13487
78
+ sentience/trace_indexing/__init__.py,sha256=urjLuqqXCQE8pnwpYBqoMKnzZSqFJkM1SHmFve9RVE8,499
79
+ sentience/trace_indexing/index_schema.py,sha256=4ovMC_4t55DUkclq8NnBEEnKUZGfIieSkwMU_aBExKA,6262
80
+ sentience/trace_indexing/indexer.py,sha256=zQi8kDHisp5Pb6x42D7odM0Bu5fEL2LPpb74oHwyck4,13974
81
+ sentience/utils/__init__.py,sha256=h8vjeonoe9LF6TeeoJuJ9g6BdsCUP24lhmME7T9jhok,1125
82
+ sentience/utils/browser.py,sha256=pcDlAMgvmkjG13lNXe_LXiHmQs2QRQQBliTZiP7f1wA,1313
83
+ sentience/utils/element.py,sha256=S8AL9T-wqrbSJvJE-qr_Qv2FVk_gRiy6nx30hdRXy4E,6962
84
+ sentience/utils/formatting.py,sha256=IQ-3kLZu1k5ae4rlQ_AxnIkVPeLR9aa8J2NE-dj_eos,1829
85
+ sentienceapi-0.98.0.dist-info/licenses/LICENSE,sha256=jePeclQKwKdmz3jc0Oec6-jQuzwxIcGWPhMfxVII34Q,924
86
+ sentienceapi-0.98.0.dist-info/licenses/LICENSE-APACHE,sha256=YIflUygmGOc0hS_1f6EacrQUrH73G3j8VBQbDoqmY6A,11352
87
+ sentienceapi-0.98.0.dist-info/licenses/LICENSE-MIT,sha256=KiWwku3f8ikn6c8a6t0IdelVEu5GBLLr4tUKdGNNgJ8,1082
88
+ sentienceapi-0.98.0.dist-info/METADATA,sha256=HvsKbnvDI-aTxsD0rfW3od7AFH9Hv3vS3u1-tOS0VDg,32680
89
+ sentienceapi-0.98.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
90
+ sentienceapi-0.98.0.dist-info/entry_points.txt,sha256=HdW1BvgRJm3ZAbbqrwTvDWE2KbmVz-Ue0wllW-mLmvA,49
91
+ sentienceapi-0.98.0.dist-info/top_level.txt,sha256=A9IKao--8PsFFz5vDfBIXWHgN6oh3HkMQSiQWgUTUBQ,10
92
+ sentienceapi-0.98.0.dist-info/RECORD,,
@@ -1,4 +0,0 @@
1
- // test-content.js - Simple test script
2
- console.log('TEST: Extension content script is loading!');
3
- window.testExtension = true;
4
- alert('Extension loaded!');
@@ -1,50 +0,0 @@
1
- sentience/__init__.py,sha256=SFq6-EcrT4HxKerSK3eaZynY703myzFq-fOi5K3YJ3A,3410
2
- sentience/_extension_loader.py,sha256=bnZgVE5eZnUk18i2Wm8gplsVekq-fB31DNWOZt5iWpw,1356
3
- sentience/actions.py,sha256=RT8AoR_CNyp6bMCYhkToWH1WB8cyB8dcFJZMhfskTeo,13239
4
- sentience/agent.py,sha256=IKSxDDCyMyGx8mMvIT4kq3HXtKNaK7BiHNGXnxHCkZc,23844
5
- sentience/agent_config.py,sha256=blyCUh2pjMOI6YQGLWP8mSi6GTnpzWLWem4nwYg3ngA,1489
6
- sentience/async_api.py,sha256=NSAM8XO9_ZjqVdOjMEwkeih2BKCXVgUHe7S2T5n8slg,38721
7
- sentience/base_agent.py,sha256=861XkIJeig9nqdt7f2wfFKyxanGZtDhnrgsMDdXtkFM,2979
8
- sentience/browser.py,sha256=Mnok-PZPbZVZUAEX9FVIANyaRrjIxaXA7fk6BBegFDo,24388
9
- sentience/cli.py,sha256=R95DgCSJmezuymAdfL6fzUdB1HpCF3iMWcLO73KJ8eY,3851
10
- sentience/cloud_tracing.py,sha256=zQv42I7GOoBXMhH5f_RUx8DT_r5IXv2kQOCeAXcMCYQ,13495
11
- sentience/conversational_agent.py,sha256=8o2bvdaxoqgK-hHM1AVOywwKWyZturp1oLFcl6JtqCw,17258
12
- sentience/expect.py,sha256=BFSRocNJr6ZAusb6fy4OgfDNCukGfu5jto760bFN12E,2851
13
- sentience/formatting.py,sha256=0_UklIUd94a4W32gTorjxoXNE03qdffR-omfTA5eHF0,1828
14
- sentience/generator.py,sha256=Wj--yn6bVo02nABBzrAIKPMmU8TRQm3JHAOER9XXT4Y,8035
15
- sentience/inspector.py,sha256=TvLi0DIjeFcWdBVqroCMMtN98SX11fLmjg5Tg5dlSdU,7244
16
- sentience/llm_provider.py,sha256=ylDMUYYbk83Nh9kW6jNvmtg_vS44AersDrii39_Y6m4,20566
17
- sentience/models.py,sha256=Y-EF7DN5f1PyYp6z9vlYqjEKusjiKzxCqitzPrIJ--w,13242
18
- sentience/overlay.py,sha256=lPCqLhLGPnBk5X-W4oAaLGI54Pl_VLCS8P1b7PFUdlo,3857
19
- sentience/query.py,sha256=P9Hs3otwESNncaArUwaw73mNNRFeOgpjy-fOTDQiCOI,10474
20
- sentience/read.py,sha256=qoSbahcNumvb0mUe-WcWrKrkKCEqya6Ac7wqXFe3SRI,3490
21
- sentience/recorder.py,sha256=RWzkJP6LWiFAJUfbXQS3aAnRgl7aDrWuKw3slp-gR1Y,12496
22
- sentience/screenshot.py,sha256=1UJjRvPxPpiL3w1_MBvO_UPMAsmt-uyRujTYA50jim0,1607
23
- sentience/snapshot.py,sha256=_tR6LTH5Hvam80zEVW3zzvHV4xu5BwALNle4hq12IZU,9266
24
- sentience/text_search.py,sha256=UF7-Dlo69Stx_vkfcu5ss3dKCVgyWODrafJoJXU9NCw,5753
25
- sentience/tracer_factory.py,sha256=Fc_kb8ffJVGdy91cnxpxU2xjFZUyS2OiaI2pqtvl2lk,7643
26
- sentience/tracing.py,sha256=ciYSW3QXcO0BYDtjeKQLfpAysObBIKQKCAlviwU74AQ,7240
27
- sentience/utils.py,sha256=ryxiDVE_sUPHYmYnWYXADuyciD_ZawmsITDZNUeDVJg,8116
28
- sentience/wait.py,sha256=BYPK96YU0iza6tjPD-hS01ud48j3ECHgM9TmnemRA5k,2229
29
- sentience/extension/background.js,sha256=hnK32hVtHJrLtzBeXt2beRmMzr1l0U82r8zZEXyOibk,8954
30
- sentience/extension/content.js,sha256=UIuFCDTVTkXdaiXB8LMf0OP8SB_WMrMoaav5ZBXmeIo,10442
31
- sentience/extension/injected_api.js,sha256=Pr5j9MGJTInPOKfKKNuaMDjOJSK3ygM-HlmWAUUS-Yg,63790
32
- sentience/extension/manifest.json,sha256=MfkfsS5zVxb-scqJllN8aubrRN9vsznQ3-Aw69pZ47c,897
33
- sentience/extension/release.json,sha256=SnuTzbdXcwAsP4dhp9fMfzlf0wDsaj8Wyn_PpCsOThM,6437
34
- sentience/extension/test-content.js,sha256=RX6A42W-5pjP-avqGwrRq_GVp5yX2NqBDlDLc-SWL5g,156
35
- sentience/extension/pkg/sentience_core.d.ts,sha256=qrTEIR2WPkk1MmaSQzEpRyagbE9VirHowzZpbj41qeQ,1981
36
- sentience/extension/pkg/sentience_core.js,sha256=zldlOubec0pbNYhquwDzoQKuBF4SUVcIeXW_qLx0dVA,17904
37
- sentience/extension/pkg/sentience_core_bg.wasm,sha256=HtzBY8z4XgRgHHUqHQGm84EEQJirpf25wSVTXg-iJ1g,102522
38
- sentience/extension/pkg/sentience_core_bg.wasm.d.ts,sha256=O3c3HaUqmB6Aob6Pt0n3GEtTxM4VGeaClaA_-z2m2J4,517
39
- sentience/schemas/trace_v1.json,sha256=XpByPqRH1xzHmD7YeuaDE5ZaEb3L5fz762djcwXqPV8,7593
40
- sentience/trace_indexing/__init__.py,sha256=urjLuqqXCQE8pnwpYBqoMKnzZSqFJkM1SHmFve9RVE8,499
41
- sentience/trace_indexing/index_schema.py,sha256=Hz9igHFrHATTZOqKNiLhESjnGbDPTyRTejMGT1AKC8g,2180
42
- sentience/trace_indexing/indexer.py,sha256=m-p57Va0cFlCpuMWkXNSHqODpGzpESZzoOkt3OiejlM,10811
43
- sentienceapi-0.90.16.dist-info/licenses/LICENSE,sha256=jePeclQKwKdmz3jc0Oec6-jQuzwxIcGWPhMfxVII34Q,924
44
- sentienceapi-0.90.16.dist-info/licenses/LICENSE-APACHE,sha256=YIflUygmGOc0hS_1f6EacrQUrH73G3j8VBQbDoqmY6A,11352
45
- sentienceapi-0.90.16.dist-info/licenses/LICENSE-MIT,sha256=KiWwku3f8ikn6c8a6t0IdelVEu5GBLLr4tUKdGNNgJ8,1082
46
- sentienceapi-0.90.16.dist-info/METADATA,sha256=Nlotvwvkv5WMtT5avm1aqoyCRbT1qgqL0kKZL2d8pfQ,27286
47
- sentienceapi-0.90.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
48
- sentienceapi-0.90.16.dist-info/entry_points.txt,sha256=HdW1BvgRJm3ZAbbqrwTvDWE2KbmVz-Ue0wllW-mLmvA,49
49
- sentienceapi-0.90.16.dist-info/top_level.txt,sha256=A9IKao--8PsFFz5vDfBIXWHgN6oh3HkMQSiQWgUTUBQ,10
50
- sentienceapi-0.90.16.dist-info/RECORD,,