@fastbrowse/linux-arm64 0.7.0 → 0.7.3

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.
@@ -983,6 +983,41 @@
983
983
  readText(document, 0, 0);
984
984
  const viewport_text = words.join('\n');
985
985
 
986
+ // Page state carried by pixels: a chart, a picture, a drawing or a video is evidence the page text and the
987
+ // control list cannot hold, and the verifier needs the screenshot for it. Only what the viewport shows counts,
988
+ // because that is what a screenshot captures: an image below the fold cannot appear in it, and counting every
989
+ // image on a long page would ask for a screenshot on almost every page and undo the gate it exists to serve.
990
+ // Geometry is read in the parent's coordinates the way readText reads text, so a frame's image counts where the
991
+ // frame itself sits on screen. Elements small enough to be an icon or a rule are not page state.
992
+ const VISUAL = 'img,canvas,video,svg,picture,figure,[role="img"]';
993
+ const VISUAL_MIN_PX = 48;
994
+ let visual_content = 0;
995
+ const readVisual = (doc, dx, dy) => {
996
+ if (visual_content) return;
997
+ for (const e of doc.querySelectorAll(VISUAL)) {
998
+ if (e.closest('[aria-hidden="true"],[inert]') || !visible(e)) continue;
999
+ const r = e.getBoundingClientRect();
1000
+ const top = r.top + dy,
1001
+ left = r.left + dx;
1002
+ if (r.width < VISUAL_MIN_PX || r.height < VISUAL_MIN_PX) continue;
1003
+ if (top + r.height <= 0 || top >= innerHeight || left + r.width <= 0 || left >= innerWidth) continue;
1004
+ visual_content = 1;
1005
+ return;
1006
+ }
1007
+ for (const frame of doc.querySelectorAll('iframe,frame')) {
1008
+ let inner = null;
1009
+ try {
1010
+ inner = frame.contentDocument;
1011
+ } catch {
1012
+ inner = null;
1013
+ }
1014
+ if (!inner || !granted(inner)) continue;
1015
+ const f = frame.getBoundingClientRect();
1016
+ readVisual(inner, dx + f.left + frame.clientLeft, dy + f.top + frame.clientTop);
1017
+ }
1018
+ };
1019
+ readVisual(document, 0, 0);
1020
+
986
1021
  const guards = {},
987
1022
  retarget_keys = {};
988
1023
  for (const c of controls) {
@@ -1035,6 +1070,7 @@
1035
1070
  url: location.href,
1036
1071
  title: document.title,
1037
1072
  viewport_text,
1073
+ visual_content,
1038
1074
  document_key: String(performance.timeOrigin),
1039
1075
  controls: semantics,
1040
1076
  page_key,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: fastbrowse
3
- Version: 0.7.0
3
+ Version: 0.7.3
4
4
  Summary: Browser automation with cited answers, structured output and code-controlled credentials and authorization.
5
5
  Project-URL: Homepage, https://github.com/agent-labs-dev/fastbrowse
6
6
  Project-URL: Repository, https://github.com/agent-labs-dev/fastbrowse
@@ -133,6 +133,7 @@ Steps go to stderr; the status, cost, step count, the reason a run stopped short
133
133
  | `--start URL` | the page to open first; worked out from the task when omitted |
134
134
  | `--cloud` | force cloud Chrome even when `FASTBROWSE_PROFILE` or `FASTBROWSE_HEADED` is set |
135
135
  | `--local` | use local Chrome instead of a Browser Use Cloud browser. Cloud is the default: it passes bot checks a fresh Chrome fails, and prints a URL to watch the run live |
136
+ | `--fetch` | read pages over HTTP and start no browser at all, for a task that only has to read one and needs no clicking, forms or screenshots |
136
137
  | `--headed` | show the local Chrome window (implies `--local`) |
137
138
  | `--profile DIR` | keep the local Chrome profile in `DIR`, so a site signed into there stays signed in (implies `--local`) |
138
139
  | `--cloud-profile ID` | run on a Browser Use Cloud profile, signed in as whoever set it up |
@@ -148,6 +149,7 @@ Steps go to stderr; the status, cost, step count, the reason a run stopped short
148
149
  | `--max-steps N`, `--max-dollars N` | optionally bound steps and model spend; defaults are unlimited. Cloud browser charges are added when it stops |
149
150
  | `--downloads DIR` | keep downloaded files |
150
151
  | `--json` | full result instead of the answer |
152
+ | `--trace FILE` | append the run's trace to `FILE` as JSON lines, or `-` for stderr: each model call with its purpose and timing, which reader answered each read and why, every check's scores and each recovery's reason. It holds ids, scores, redacted addresses, requirement texts and control labels, not page captures. `FASTBROWSE_TRACE` does the same for `serve` and the MCP server |
151
153
  | `--record FILE` | save an MP4 of the tab, each step captioned, ending on the answer, time and cost (needs `ffmpeg`; the captions need its libass), e.g. `recordings/demo.mp4`, which git ignores; `demo.plain.mp4` beside it has no captions. It shows what the pages showed, so watch it before sharing |
152
154
  | `--cursor` | draw the agent's cursor over a visible Chrome (`--headed`, or one you attach to) with [Cua Driver](https://github.com/trycua/cua), so you can watch where it acts. Off by default. It needs `cua-driver` on `PATH` and an X11 display on Linux, and does nothing without them. It brings the run's tab to the front as `--foreground` does, since the cursor lies over the window's front tab |
153
155
 
@@ -296,7 +298,7 @@ without a field-writing generation.
296
298
 
297
299
  A browser command that remains unanswered for 120 seconds returns `unavailable`, even if the browser
298
300
  still answers health checks. Step and dollar limits do not bound total elapsed time. Set `Limits(max_seconds=...)` for a run deadline.
299
- When investigating a stalled run, enable trace logging and retain the last event alongside the result.
301
+ When investigating a stalled run, write its trace with `--trace FILE` (or `FASTBROWSE_TRACE=FILE` for `serve` and the MCP server) and keep the last event alongside the result.
300
302
 
301
303
  [Troubleshooting](docs/troubleshooting.md) takes each status a run can stop with: what it means, its common
302
304
  causes and the next step.
@@ -420,7 +422,9 @@ it can be `None` for an ordinary successful action.
420
422
 
421
423
  For continuous live images, pass an async `on_frame` handler accepting JPEG bytes. Frames follow the active
422
424
  tab and are acknowledged after delivery, with no fixed frame rate. Only the latest pending frame is kept.
423
- Handler failures are logged without stopping the run. Live frames and recordings are held back while a
425
+ Handler failures are logged without stopping the run. A handler must honour cancellation: it runs on the
426
+ caller's event loop, so one that catches `CancelledError` without re-raising keeps that loop alive, and
427
+ `asyncio.run` then waits for it at shutdown. Live frames and recordings are held back while a
424
428
  resolved secret may show on the page, as PNG step frames are. No handler means no live capture.
425
429
 
426
430
  Jev uses direct TypeSafe when keyed, otherwise OpenRouter, with Vercel AI Gateway also supported.
@@ -0,0 +1,14 @@
1
+ ../../../bin/fastbrowse,sha256=kaVbuMx-AlSCiesFjTFd09Km4R8Lunnqm06vuR0Q4ow,336
2
+ ../../../bin/fastbrowse-mcp,sha256=ZXqxb9qRtFFkC1H9e4YqAdOBsFqTUwa9EZeg_4K3Ybo,343
3
+ _editable_impl_fastbrowse.pth,sha256=i4F7SPHtRO2rWCDD5u0Gnwv0cyF2GMJMQGgsS1QKCTI,43
4
+ fastbrowse-0.7.3.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
5
+ fastbrowse-0.7.3.dist-info/METADATA,sha256=Z_DUoeZGMQEm7pT1232-a7PAplk6ABH_ZuR7iEp5IQ4,39344
6
+ fastbrowse-0.7.3.dist-info/RECORD,,
7
+ fastbrowse-0.7.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ fastbrowse-0.7.3.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
9
+ fastbrowse-0.7.3.dist-info/direct_url.json,sha256=p4VhBh51_mJBO89EvLp28QXawaajq5zi5eItI6PDXTg,85
10
+ fastbrowse-0.7.3.dist-info/entry_points.txt,sha256=SlQAK1_4_oywTAMckx8BYuCQJva0F-QuShQPcxtUm-g,95
11
+ fastbrowse-0.7.3.dist-info/licenses/LICENSE,sha256=gcUazG_j5a2blKPmfKqRKE98KOqX2kPbWY-EOtQZiNU,1067
12
+ fastbrowse-0.7.3.dist-info/licenses/NOTICE,sha256=qEO0Az_Tk98vRVL0xjnGYgMvexlMCA92lWl4JBwYRzg,1854
13
+ fastbrowse-0.7.3.dist-info/uv_build.json,sha256=RBNvo1WzZ4oRRq0W9-hknpT7T8If536DEMBg9hyq_4o,2
14
+ fastbrowse-0.7.3.dist-info/uv_cache.json,sha256=2MpazsfZgWkgpOV4s-sSjw44VjO_bi3neMxsqo7XggI,194
@@ -0,0 +1 @@
1
+ {"timestamp":{"secs_since_epoch":1793030879,"nanos_since_epoch":102410023},"commit":null,"tags":null,"env":{},"directories":{"src":{"secs_since_epoch":1793030879,"nanos_since_epoch":103410056}}}
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fastbrowse/linux-arm64",
3
- "version": "0.7.0",
3
+ "version": "0.7.3",
4
4
  "description": "The fastbrowse binary for Linux on arm64.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,14 +0,0 @@
1
- ../../../bin/fastbrowse,sha256=kaVbuMx-AlSCiesFjTFd09Km4R8Lunnqm06vuR0Q4ow,336
2
- ../../../bin/fastbrowse-mcp,sha256=ZXqxb9qRtFFkC1H9e4YqAdOBsFqTUwa9EZeg_4K3Ybo,343
3
- _editable_impl_fastbrowse.pth,sha256=i4F7SPHtRO2rWCDD5u0Gnwv0cyF2GMJMQGgsS1QKCTI,43
4
- fastbrowse-0.7.0.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
5
- fastbrowse-0.7.0.dist-info/METADATA,sha256=7vV9jxG0yGiwE2e_oimnIrnEMsrz3D7N5w-HlzvCHiQ,38538
6
- fastbrowse-0.7.0.dist-info/RECORD,,
7
- fastbrowse-0.7.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- fastbrowse-0.7.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
9
- fastbrowse-0.7.0.dist-info/direct_url.json,sha256=p4VhBh51_mJBO89EvLp28QXawaajq5zi5eItI6PDXTg,85
10
- fastbrowse-0.7.0.dist-info/entry_points.txt,sha256=SlQAK1_4_oywTAMckx8BYuCQJva0F-QuShQPcxtUm-g,95
11
- fastbrowse-0.7.0.dist-info/licenses/LICENSE,sha256=gcUazG_j5a2blKPmfKqRKE98KOqX2kPbWY-EOtQZiNU,1067
12
- fastbrowse-0.7.0.dist-info/licenses/NOTICE,sha256=qEO0Az_Tk98vRVL0xjnGYgMvexlMCA92lWl4JBwYRzg,1854
13
- fastbrowse-0.7.0.dist-info/uv_build.json,sha256=RBNvo1WzZ4oRRq0W9-hknpT7T8If536DEMBg9hyq_4o,2
14
- fastbrowse-0.7.0.dist-info/uv_cache.json,sha256=cM8Kt6el4Da0l2rvWUdne1zO6xw8r70fl_ly3mjmEkA,194
@@ -1 +0,0 @@
1
- {"timestamp":{"secs_since_epoch":1792857026,"nanos_since_epoch":313378296},"commit":null,"tags":null,"env":{},"directories":{"src":{"secs_since_epoch":1792857026,"nanos_since_epoch":314378252}}}