@stratusagent/tool-browser 0.10.0 → 0.11.1
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.
- package/README.md +66 -3
- package/dist/driver.d.ts +5 -0
- package/dist/driver.d.ts.map +1 -1
- package/dist/driver.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +173 -30
- package/dist/index.js.map +1 -1
- package/dist/sessions.d.ts +33 -8
- package/dist/sessions.d.ts.map +1 -1
- package/dist/sessions.js +196 -57
- package/dist/sessions.js.map +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -45,7 +45,62 @@ fails that one call with a message naming the fix.
|
|
|
45
45
|
| `browser.goto` | `gated` | `interactive` asks, `remote` asks in Slack, `headless` refuses. |
|
|
46
46
|
| `browser.read` | `gated` | Same. Navigating and reading reach a service outside Stratus. |
|
|
47
47
|
| `browser.screenshot` | `gated` | Same. Writes a PNG into the agent's workspace and returns it as `file`, which a channel delivers as an attachment. |
|
|
48
|
-
| `browser.act` | `
|
|
48
|
+
| `browser.act` | `gated`, then judged per site | `interactive` and `remote` ask, naming the site; `headless` runs it only on an origin the agent has been granted. See below. |
|
|
49
|
+
|
|
50
|
+
### Acting is scoped by origin
|
|
51
|
+
|
|
52
|
+
A click submits, buys, and deletes: navigating somewhere else undoes a
|
|
53
|
+
`goto`, and nothing undoes a click. `browser.act` was `dangerous` for that
|
|
54
|
+
reason for a long time — a human every time, in every mode, which in
|
|
55
|
+
`headless` meant a flat refusal and an installed service that could never
|
|
56
|
+
click anything at all.
|
|
57
|
+
|
|
58
|
+
That position was hard to defend on its own terms. A shell command can be
|
|
59
|
+
far more destructive than a click and *is* allowed unattended inside
|
|
60
|
+
command scopes; the difference was never the blast radius, it was that a
|
|
61
|
+
command string describes its own effect and a CSS selector does not.
|
|
62
|
+
`click("#submit")` is equally "load more results" and "confirm purchase",
|
|
63
|
+
so `dangerous` was standing in for **no scope model exists for this**.
|
|
64
|
+
|
|
65
|
+
There is one now, and it is the vocabulary the address policy already
|
|
66
|
+
speaks: the **origin of the page the conversation is on**.
|
|
67
|
+
|
|
68
|
+
```jsonc
|
|
69
|
+
// ~/.stratus/agents/ava.whitelist.json — beside the agent's soul, 0600
|
|
70
|
+
{ "version": 1, "scopes": [], "origins": [{ "origin": "https://app.example.com" }] }
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`Tool.originFor` is how the tool answers, and it is deliberately **not**
|
|
74
|
+
given the call's input. An origin parameter would be the model's claim
|
|
75
|
+
about where it is, which is precisely what a grant must not take on trust;
|
|
76
|
+
the pool already tracks a page per conversation, so the origin comes from
|
|
77
|
+
there. A conversation that has not navigated has no origin, so nothing
|
|
78
|
+
covers the call and it asks — and `browser.act` never receives a tool-wide
|
|
79
|
+
grant on any answer, so one yes to a page is never a yes to every page.
|
|
80
|
+
|
|
81
|
+
**A per-origin scope does not make a click safe.** Acting on
|
|
82
|
+
`app.example.com` still covers "delete the record" alongside "load more".
|
|
83
|
+
It makes the blast radius *nameable*, which is what one risk word gave up
|
|
84
|
+
on. Two things it does not cover:
|
|
85
|
+
|
|
86
|
+
- The origin is read when the call is judged, again as the last thing
|
|
87
|
+
before the call is allowed, once more by the kernel immediately before
|
|
88
|
+
the tool is dispatched, and a fourth time inside `browser.act` after its
|
|
89
|
+
page is opened — including when the judgement was *no page at all*, so a
|
|
90
|
+
page that appears in that window is refused rather than clicked — so none of the waits in between can have a yes given for
|
|
91
|
+
one site land on another: a human's fifteen minutes, the write that
|
|
92
|
+
persists a grant, the session-store checkpoint, a `tool.called`
|
|
93
|
+
subscriber, or the browser launch that opening a page can trigger. A
|
|
94
|
+
grant already written names the site the approver read, never the one the
|
|
95
|
+
page moved to. What is left is Playwright's own wait for the selector
|
|
96
|
+
(`navigationTimeoutMs`), which nothing outside the browser can close.
|
|
97
|
+
- It is checked in this process, where the pool holds the page. A browser
|
|
98
|
+
driven somewhere else would need the check to happen where a compromised
|
|
99
|
+
runtime cannot skip it — the concern the egress proxy already carries for
|
|
100
|
+
addresses.
|
|
101
|
+
|
|
102
|
+
[Browser actions](../../docs/guides/browser.md) is the operator-facing
|
|
103
|
+
version of all of this.
|
|
49
104
|
|
|
50
105
|
## Settings
|
|
51
106
|
|
|
@@ -58,8 +113,8 @@ fails that one call with a message naming the fix.
|
|
|
58
113
|
| `allowPrivateAddresses` | `false` | Reach non-global addresses. The trusted-workstation posture. |
|
|
59
114
|
| `idleMs` | `300000` | Close a conversation's context after this much quiet. |
|
|
60
115
|
| `maxContexts` | `4` | Contexts at once; the least recently used goes first. |
|
|
61
|
-
| `maxTextBytes` | `100000` | Cap on `browser.read`, then a `truncated` marker. |
|
|
62
|
-
| `navigationTimeoutMs` | `30000` | Per navigation and
|
|
116
|
+
| `maxTextBytes` | `100000` | Cap on `browser.read`, then a `truncated` marker. A call's own `maxBytes` may ask for less, never more. |
|
|
117
|
+
| `navigationTimeoutMs` | `30000` | Per navigation, per action, and on reading a page — one whose script never yields is given up on, its context closed, and the next call opens a fresh page. |
|
|
63
118
|
| `workspaceRoot` | supplied by the daemon | Where screenshots go: `<root>/<agent-id>/screenshots`. |
|
|
64
119
|
|
|
65
120
|
Address settings apply per agent under `agents`, and they are enforced —
|
|
@@ -94,6 +149,14 @@ other local schemes never reach a proxy at all, and this process can read
|
|
|
94
149
|
the files they name. Those are refused before navigation and again on every
|
|
95
150
|
request the page makes.
|
|
96
151
|
|
|
152
|
+
Each conversation's context browses through a proxy of its own, under the
|
|
153
|
+
same policy as the browser's. What was refused is reported once, as
|
|
154
|
+
`blockedRequests` on the next result of the conversation whose page was
|
|
155
|
+
browsing — never to another conversation, however alike their policies,
|
|
156
|
+
never to one that began after it, and never twice. A proxy keeps its last
|
|
157
|
+
hundred refusals for that, so a page refused something on every load does
|
|
158
|
+
not grow the daemon's memory.
|
|
159
|
+
|
|
97
160
|
The address policy itself is [`@stratusagent/egress`](../egress) — the same
|
|
98
161
|
module `tool-web` uses, tested against the same table of hostile URLs. A
|
|
99
162
|
second copy would not drift into a style difference; the stale one would be
|
package/dist/driver.d.ts
CHANGED
|
@@ -53,6 +53,11 @@ export interface BrowserLike {
|
|
|
53
53
|
width: number;
|
|
54
54
|
height: number;
|
|
55
55
|
};
|
|
56
|
+
/** A proxy for this context alone, overriding the one the browser was launched with. */
|
|
57
|
+
proxy?: {
|
|
58
|
+
server: string;
|
|
59
|
+
bypass: string;
|
|
60
|
+
};
|
|
56
61
|
}): Promise<BrowserContextLike>;
|
|
57
62
|
close(): Promise<void>;
|
|
58
63
|
}
|
package/dist/driver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,IAAI,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC5G,GAAG,IAAI,MAAM,CAAC;IACd,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5E,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI;QAAE,GAAG,IAAI,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAA;KAAE,CAAC;IAC1D,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,OAAO,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,IAAI,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC5G,GAAG,IAAI,MAAM,CAAC;IACd,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5E,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI;QAAE,GAAG,IAAI,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAA;KAAE,CAAC;IAC1D,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,OAAO,CAAC,EAAE;QACnB,QAAQ,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7C,wFAAwF;QACxF,KAAK,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC5C,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACtD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM,kBAAkB,KAAG,aA8BhE,CAAC"}
|
package/dist/driver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA0D3D;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAwB,EAAiB,EAAE,CAAC,CAAC;IAClF,KAAK,CAAC,MAAM,CAAC,OAAO;QAClB,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAExC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,2DAA2D;kBACzD,gFAAgF,CACnF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,sEAAsE;YACtE,qEAAqE;YACrE,MAAM,IAAI,KAAK,CACb,8BAA8B,OAAO,IAAI;kBACvC,gGAAgG;kBAChG,mEAAmE,CACtE,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type JsonObject, type Plugin } from '@stratusagent/core';
|
|
2
2
|
import { type OptionalModuleHost } from '@stratusagent/plugins';
|
|
3
3
|
import { type BrowserDriver } from './driver.ts';
|
|
4
4
|
export { createPlaywrightDriver, type BrowserContextLike, type BrowserDriver, type BrowserLike, type LaunchOptions, type PageLike, type RouteLike, } from './driver.ts';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,UAAU,EAAkB,KAAK,MAAM,EAA2B,MAAM,oBAAoB,CAAC;AAErH,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE1F,OAAO,EAA0B,KAAK,aAAa,EAAiC,MAAM,aAAa,CAAC;AAGxG,OAAO,EACL,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,SAAS,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAK5E,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACrD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA4aD,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAQ,UAAe,EACvB,UAAS,oBAAyB,KACjC,MAAM,GAAG;IAAE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CA8EhF,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,YAAY,GAAI,SAAQ,UAAe,KAAG,MAAqC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,8 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
|
|
|
8
8
|
};
|
|
9
9
|
import { mkdir } from 'node:fs/promises';
|
|
10
10
|
import path from 'node:path';
|
|
11
|
-
import {
|
|
11
|
+
import { originOf } from '@stratusagent/core';
|
|
12
|
+
import { assertRequestAllowed, egressPolicyFrom } from '@stratusagent/egress';
|
|
12
13
|
import { resolvePluginAgentConfig } from '@stratusagent/plugins';
|
|
13
14
|
import { createPlaywrightDriver } from "./driver.js";
|
|
14
15
|
import { BrowserSessionPool } from "./sessions.js";
|
|
@@ -17,16 +18,12 @@ export { BrowserSessionPool } from "./sessions.js";
|
|
|
17
18
|
const DEFAULT_NAVIGATION_TIMEOUT_MS = 30_000;
|
|
18
19
|
const DEFAULT_MAX_TEXT_BYTES = 100_000;
|
|
19
20
|
const asNumber = (value, fallback) => typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
...(Array.isArray(resolved.allowedHosts)
|
|
24
|
-
? { allowedHosts: resolved.allowedHosts.filter((entry) => typeof entry === 'string') }
|
|
25
|
-
: {}),
|
|
26
|
-
});
|
|
21
|
+
// A per-call `maxBytes` may narrow the operator's `maxTextBytes`, never
|
|
22
|
+
// raise it — a cap the model can lift by naming a bigger number is not one.
|
|
23
|
+
const narrowed = (requested, cap) => Math.min(asNumber(requested, cap), cap);
|
|
27
24
|
const settingsFor = (config, session) => {
|
|
28
25
|
const resolved = resolvePluginAgentConfig(config, session.agent.id);
|
|
29
|
-
const policy =
|
|
26
|
+
const policy = egressPolicyFrom(resolved);
|
|
30
27
|
return {
|
|
31
28
|
policy,
|
|
32
29
|
maxTextBytes: asNumber(resolved.maxTextBytes, DEFAULT_MAX_TEXT_BYTES),
|
|
@@ -77,11 +74,81 @@ const guardRequests = async (page, policy, record) => {
|
|
|
77
74
|
* of the policy: the scheme guard inside the browser, and the proxy that
|
|
78
75
|
* owns the connections. Reported to the agent because a page that renders
|
|
79
76
|
* empty because its requests were blocked is otherwise a mystery it retries.
|
|
77
|
+
*
|
|
78
|
+
* Each refusal is reported once — this drains what it reports — so a
|
|
79
|
+
* result names what happened since the last one, not everything that ever
|
|
80
|
+
* did. Called once per result, for the same reason.
|
|
81
|
+
*/
|
|
82
|
+
const refusalsFor = (runtime, session) => {
|
|
83
|
+
const inBrowser = runtime.blocked.get(session.id) ?? [];
|
|
84
|
+
runtime.blocked.delete(session.id);
|
|
85
|
+
return [...inBrowser, ...runtime.pool.refusalsFor(session.id)].slice(-10);
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Bound a page operation Playwright does not bound itself. `evaluate` and
|
|
89
|
+
* `title` run on the page's main thread, and a page whose script is
|
|
90
|
+
* spinning never answers either — `browser.read` on one hung until the idle
|
|
91
|
+
* sweep happened to close the context under it: forty seconds in a probe,
|
|
92
|
+
* five minutes at the default `idleMs`, on a call a human had approved.
|
|
93
|
+
* The page will not come back, so its context is closed and the error says
|
|
94
|
+
* the next call opens a fresh one.
|
|
95
|
+
*/
|
|
96
|
+
const answeredWithin = async (work, timeoutMs, describe, giveUp) => {
|
|
97
|
+
let timer;
|
|
98
|
+
const expired = new Promise((_resolve, reject) => {
|
|
99
|
+
timer = setTimeout(() => reject(new Error(describe())), timeoutMs);
|
|
100
|
+
});
|
|
101
|
+
try {
|
|
102
|
+
return await Promise.race([work, expired]);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (timer !== undefined && error instanceof Error && error.message === describe()) {
|
|
106
|
+
// The abandoned operation settles later, when the context goes;
|
|
107
|
+
// nobody is listening for that, and it must not surface as unhandled.
|
|
108
|
+
work.catch(() => { });
|
|
109
|
+
// The teardown is bounded too: closing a context on a transport this
|
|
110
|
+
// wedged can hang the way the page did, and waiting on it would make
|
|
111
|
+
// the timeout a promise this call still broke. Past the bound the
|
|
112
|
+
// close carries on unwaited — the pool forgot the context the moment
|
|
113
|
+
// the release began, so the next call opens a fresh one either way.
|
|
114
|
+
await within(giveUp().catch(() => undefined), timeoutMs);
|
|
115
|
+
}
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
clearTimeout(timer);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
/** Resolves when `work` settles or `ms` pass, whichever is first. */
|
|
123
|
+
const within = (work, ms) => new Promise((resolve) => {
|
|
124
|
+
const timer = setTimeout(resolve, ms);
|
|
125
|
+
void work.then(() => {
|
|
126
|
+
clearTimeout(timer);
|
|
127
|
+
resolve();
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
/**
|
|
131
|
+
* How many judgements are kept at once. Generous next to `maxContexts`,
|
|
132
|
+
* because a call that is judged and then *denied* never reaches the
|
|
133
|
+
* `execute` that would consume its entry, and only the next call for that
|
|
134
|
+
* conversation replaces it. Insertion-ordered, so the oldest goes first;
|
|
135
|
+
* an entry that far back describes a call long since finished, and losing
|
|
136
|
+
* it costs a check nothing was waiting on.
|
|
80
137
|
*/
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
138
|
+
const REPORTED_ORIGIN_LIMIT = 64;
|
|
139
|
+
/** Record a judgement, oldest evicted once the cap is reached. */
|
|
140
|
+
const rememberReportedOrigin = (reported, sessionId, origin) => {
|
|
141
|
+
// Deleted first so a repeat becomes the newest again rather than keeping
|
|
142
|
+
// the position it was first inserted at.
|
|
143
|
+
reported.delete(sessionId);
|
|
144
|
+
reported.set(sessionId, origin);
|
|
145
|
+
if (reported.size > REPORTED_ORIGIN_LIMIT) {
|
|
146
|
+
const oldest = reported.keys().next().value;
|
|
147
|
+
if (oldest !== undefined) {
|
|
148
|
+
reported.delete(oldest);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
};
|
|
85
152
|
const truncate = (value, maxBytes) => Buffer.byteLength(value, 'utf8') <= maxBytes
|
|
86
153
|
? { text: value, truncated: false }
|
|
87
154
|
: { text: `${value.slice(0, maxBytes)}\n… truncated at ${maxBytes} bytes`, truncated: true };
|
|
@@ -119,13 +186,17 @@ const createTools = (config, runtime) => {
|
|
|
119
186
|
const settings = settingsFor(config, session);
|
|
120
187
|
const page = await runtime.pageFor(session);
|
|
121
188
|
const status = await navigate(page, String(input.url ?? ''), settings.policy, settings.navigationTimeoutMs);
|
|
189
|
+
// Everything that can still fail first, and the drain last: the
|
|
190
|
+
// refusal list is emptied by reading it, so a `title()` that throws
|
|
191
|
+
// after the drain would take the refusals with it and no result
|
|
192
|
+
// would ever carry them.
|
|
193
|
+
const title = await runtime.ask(session, page, 'its title', () => page.title(), settings.navigationTimeoutMs);
|
|
194
|
+
const blockedRequests = refusalsFor(runtime, session);
|
|
122
195
|
return {
|
|
123
196
|
url: page.url(),
|
|
124
197
|
...(status === undefined ? {} : { status }),
|
|
125
|
-
title
|
|
126
|
-
...(
|
|
127
|
-
? { blockedRequests: refusalsFor(runtime, session) }
|
|
128
|
-
: {}),
|
|
198
|
+
title,
|
|
199
|
+
...(blockedRequests.length > 0 ? { blockedRequests } : {}),
|
|
129
200
|
};
|
|
130
201
|
},
|
|
131
202
|
};
|
|
@@ -143,16 +214,16 @@ const createTools = (config, runtime) => {
|
|
|
143
214
|
if (typeof input.url === 'string' && input.url.length > 0) {
|
|
144
215
|
await navigate(page, input.url, settings.policy, settings.navigationTimeoutMs);
|
|
145
216
|
}
|
|
146
|
-
const extracted = await page.evaluate(READABLE_TEXT_SCRIPT);
|
|
147
|
-
const { text, truncated } = truncate(typeof extracted === 'string' ? extracted : '',
|
|
217
|
+
const extracted = await runtime.ask(session, page, 'its text', () => page.evaluate(READABLE_TEXT_SCRIPT), settings.navigationTimeoutMs);
|
|
218
|
+
const { text, truncated } = truncate(typeof extracted === 'string' ? extracted : '', narrowed(input.maxBytes, settings.maxTextBytes));
|
|
219
|
+
const title = await runtime.ask(session, page, 'its title', () => page.title(), settings.navigationTimeoutMs);
|
|
220
|
+
const blockedRequests = refusalsFor(runtime, session);
|
|
148
221
|
return {
|
|
149
222
|
url: page.url(),
|
|
150
|
-
title
|
|
223
|
+
title,
|
|
151
224
|
text,
|
|
152
225
|
truncated,
|
|
153
|
-
...(
|
|
154
|
-
? { blockedRequests: refusalsFor(runtime, session) }
|
|
155
|
-
: {}),
|
|
226
|
+
...(blockedRequests.length > 0 ? { blockedRequests } : {}),
|
|
156
227
|
};
|
|
157
228
|
},
|
|
158
229
|
};
|
|
@@ -178,16 +249,27 @@ const createTools = (config, runtime) => {
|
|
|
178
249
|
// picture in Slack rather than a path nobody can open. One key rather
|
|
179
250
|
// than a `path` alias beside it — two words for one thing is how a
|
|
180
251
|
// convention stops being one.
|
|
181
|
-
|
|
252
|
+
const title = await runtime.ask(session, page, 'its title', () => page.title(), settings.navigationTimeoutMs);
|
|
253
|
+
const blockedRequests = refusalsFor(runtime, session);
|
|
254
|
+
return {
|
|
255
|
+
file: target,
|
|
256
|
+
url: page.url(),
|
|
257
|
+
title,
|
|
258
|
+
...(blockedRequests.length > 0 ? { blockedRequests } : {}),
|
|
259
|
+
};
|
|
182
260
|
},
|
|
183
261
|
};
|
|
184
262
|
const act = {
|
|
185
263
|
name: 'browser.act',
|
|
186
264
|
description: 'Click or type on the current page.',
|
|
187
|
-
//
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
|
|
265
|
+
// `gated`, and judged per site — see `originFor` below. It was
|
|
266
|
+
// `dangerous` (a human every time, in every mode, so an installed
|
|
267
|
+
// service could never click anything at all), and that was standing in
|
|
268
|
+
// for "no scope model exists for this" rather than for "worse than a
|
|
269
|
+
// shell": a shell command can be far more destructive than a click and
|
|
270
|
+
// runs unattended inside command scopes, because a command string
|
|
271
|
+
// describes its own effect and a CSS selector does not.
|
|
272
|
+
risk: 'gated',
|
|
191
273
|
parameters: {
|
|
192
274
|
type: 'object',
|
|
193
275
|
properties: {
|
|
@@ -197,9 +279,53 @@ const createTools = (config, runtime) => {
|
|
|
197
279
|
},
|
|
198
280
|
required: ['action', 'selector'],
|
|
199
281
|
},
|
|
282
|
+
/**
|
|
283
|
+
* Where this click would land: the origin of the page this conversation
|
|
284
|
+
* is already on, which is what the permission engine scopes the call by.
|
|
285
|
+
*
|
|
286
|
+
* From the page and never from the call, and that is the security
|
|
287
|
+
* property rather than a convenience. The input names a selector, and
|
|
288
|
+
* `#submit` is equally "load more results" and "confirm purchase" — a
|
|
289
|
+
* scope written over selectors would mean nothing. An origin *parameter*
|
|
290
|
+
* would be no better: it would be the model's claim about where it is,
|
|
291
|
+
* which is precisely the thing a grant must not take on trust.
|
|
292
|
+
*
|
|
293
|
+
* It opens no page. A conversation that has not navigated yet, or whose
|
|
294
|
+
* context the idle sweep has closed, has no origin — so no scope covers
|
|
295
|
+
* the call and it asks, which is the right way to fail.
|
|
296
|
+
*/
|
|
297
|
+
originFor(session) {
|
|
298
|
+
const origin = runtime.pool.originFor(session.id);
|
|
299
|
+
// Kept for `execute` below. The kernel asks this immediately before
|
|
300
|
+
// it dispatches, so what is stored is the origin the call was judged
|
|
301
|
+
// on — the one thing `execute` needs, and the one thing it cannot
|
|
302
|
+
// work out for itself.
|
|
303
|
+
//
|
|
304
|
+
// Recorded even when there is no origin, as `null`: "judged on no
|
|
305
|
+
// page" is a fact about this call, and a page that acquires an
|
|
306
|
+
// origin before the action runs has moved just as surely as one that
|
|
307
|
+
// changed from a site to another.
|
|
308
|
+
rememberReportedOrigin(runtime.reportedOrigins, session.id, origin ?? null);
|
|
309
|
+
return origin;
|
|
310
|
+
},
|
|
200
311
|
async execute(input, session) {
|
|
201
312
|
const settings = settingsFor(config, session);
|
|
313
|
+
const judgedOn = runtime.reportedOrigins.get(session.id);
|
|
314
|
+
runtime.reportedOrigins.delete(session.id);
|
|
315
|
+
// Opening the page is not free: this may launch Chromium and build a
|
|
316
|
+
// context, which is seconds, and it happens *after* the kernel's
|
|
317
|
+
// check. So the page is checked once more here, against where the
|
|
318
|
+
// call was judged — the last point anything in this process can look
|
|
319
|
+
// before Playwright takes over.
|
|
202
320
|
const page = await runtime.pageFor(session);
|
|
321
|
+
if (judgedOn !== undefined) {
|
|
322
|
+
const now = originOf(page.url()) ?? null;
|
|
323
|
+
if (now !== judgedOn) {
|
|
324
|
+
throw new Error(`This conversation was on ${judgedOn ?? 'a page with no origin'} when the call was approved and is on `
|
|
325
|
+
+ `${now ?? 'a page with no origin'} now, so nothing was clicked. `
|
|
326
|
+
+ 'Check where the page is and call again.');
|
|
327
|
+
}
|
|
328
|
+
}
|
|
203
329
|
const selector = String(input.selector ?? '');
|
|
204
330
|
if (!selector) {
|
|
205
331
|
throw new Error('selector is required.');
|
|
@@ -213,7 +339,15 @@ const createTools = (config, runtime) => {
|
|
|
213
339
|
else {
|
|
214
340
|
throw new Error(`Unsupported action: ${String(input.action)}. Use click or type.`);
|
|
215
341
|
}
|
|
216
|
-
|
|
342
|
+
const title = await runtime.ask(session, page, 'its title', () => page.title(), settings.navigationTimeoutMs);
|
|
343
|
+
const blockedRequests = refusalsFor(runtime, session);
|
|
344
|
+
return {
|
|
345
|
+
action: input.action,
|
|
346
|
+
selector,
|
|
347
|
+
url: page.url(),
|
|
348
|
+
title,
|
|
349
|
+
...(blockedRequests.length > 0 ? { blockedRequests } : {}),
|
|
350
|
+
};
|
|
217
351
|
},
|
|
218
352
|
};
|
|
219
353
|
return [goto, read, screenshot, act];
|
|
@@ -229,6 +363,7 @@ const createTools = (config, runtime) => {
|
|
|
229
363
|
*/
|
|
230
364
|
export const createBrowserPlugin = (config = {}, options = {}) => {
|
|
231
365
|
const blocked = new Map();
|
|
366
|
+
const reportedOrigins = new Map();
|
|
232
367
|
const resolved = config;
|
|
233
368
|
const pool = new BrowserSessionPool({
|
|
234
369
|
driver: options.driver ?? createPlaywrightDriver(options.moduleHost ?? {
|
|
@@ -241,13 +376,21 @@ export const createBrowserPlugin = (config = {}, options = {}) => {
|
|
|
241
376
|
...(typeof resolved.idleMs === 'number' ? { idleMs: resolved.idleMs } : {}),
|
|
242
377
|
...(typeof resolved.maxContexts === 'number' ? { maxContexts: resolved.maxContexts } : {}),
|
|
243
378
|
onEvicted: ({ sessionId }) => {
|
|
244
|
-
// The page that recorded them is gone, so its refusals go with it
|
|
379
|
+
// The page that recorded them is gone, so its refusals go with it —
|
|
380
|
+
// and so does the origin it was last reported to be on, which
|
|
381
|
+
// describes a context that no longer exists.
|
|
245
382
|
blocked.delete(sessionId);
|
|
383
|
+
reportedOrigins.delete(sessionId);
|
|
246
384
|
},
|
|
247
385
|
});
|
|
248
386
|
const runtime = {
|
|
249
387
|
pool,
|
|
250
388
|
blocked,
|
|
389
|
+
reportedOrigins,
|
|
390
|
+
ask(session, page, what, work, timeoutMs) {
|
|
391
|
+
return answeredWithin(work(), timeoutMs, () => `The page at ${page.url()} did not answer for ${what} within ${timeoutMs}ms — its script is busy. `
|
|
392
|
+
+ 'Its browser context was closed; the next call opens a fresh page.', () => pool.release(session.id, page).then(() => undefined));
|
|
393
|
+
},
|
|
251
394
|
async pageFor(session) {
|
|
252
395
|
const settings = settingsFor(config, session);
|
|
253
396
|
// The agent's own policy decides which browser serves it: a proxy is
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/sessions.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface SessionPoolOptions {
|
|
|
12
12
|
/** Called when a page is dropped, so a caller can log it. */
|
|
13
13
|
onEvicted?: (event: {
|
|
14
14
|
sessionId: string;
|
|
15
|
-
reason: 'idle' | 'capacity' | 'shutdown' | 'policy';
|
|
15
|
+
reason: 'idle' | 'capacity' | 'shutdown' | 'policy' | 'unresponsive';
|
|
16
16
|
}) => void;
|
|
17
17
|
/** Reported rather than thrown: a sweep runs on a timer with nobody waiting on it. */
|
|
18
18
|
onError?: (error: unknown) => void;
|
|
@@ -30,7 +30,8 @@ export interface SessionPoolOptions {
|
|
|
30
30
|
* names, so it cannot narrow a hostname destination without re-opening
|
|
31
31
|
* the DNS-rebinding race the proxy exists to close.
|
|
32
32
|
* - **A context per conversation**, so two conversations never share a
|
|
33
|
-
* cookie jar or a login
|
|
33
|
+
* cookie jar or a login — and a proxy per context, under the same
|
|
34
|
+
* policy, so they never share a refusal log either.
|
|
34
35
|
* - **Nothing left running.** A context that has gone quiet is closed, and
|
|
35
36
|
* a browser whose last conversation went with it is closed too.
|
|
36
37
|
*
|
|
@@ -65,16 +66,38 @@ export declare class BrowserSessionPool {
|
|
|
65
66
|
pageFor(sessionId: string, now: number, policy?: EgressPolicy): Promise<PageLike>;
|
|
66
67
|
private admit;
|
|
67
68
|
/**
|
|
68
|
-
*
|
|
69
|
+
* The origin of the page this conversation is on, or nothing when it has
|
|
70
|
+
* no page or the page has no origin worth naming (`about:blank` before
|
|
71
|
+
* the first navigation, a context the idle sweep has closed).
|
|
69
72
|
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
73
|
+
* Synchronous, and it opens nothing. It is read while a call is being
|
|
74
|
+
* *judged*, before the tool runs — a lookup that could launch a browser
|
|
75
|
+
* would make the permission engine start one for a call it is about to
|
|
76
|
+
* refuse, and a page opened to answer "where are you" would answer
|
|
77
|
+
* `about:blank` every time in any case.
|
|
78
|
+
*/
|
|
79
|
+
originFor(sessionId: string): string | undefined;
|
|
80
|
+
/**
|
|
81
|
+
* What this session's own proxy refused — its conversation's, and no
|
|
82
|
+
* other's, whatever policy the two share.
|
|
75
83
|
*/
|
|
76
84
|
refusalsFor(sessionId: string): string[];
|
|
85
|
+
/**
|
|
86
|
+
* Close one conversation's context because its page stopped answering —
|
|
87
|
+
* a script that never yields holds `evaluate` and `title` forever, and
|
|
88
|
+
* the only way past it is a fresh page. Returns false when the session
|
|
89
|
+
* had no context to close.
|
|
90
|
+
*/
|
|
91
|
+
release(sessionId: string, page?: PageLike): Promise<boolean>;
|
|
77
92
|
private drop;
|
|
93
|
+
/**
|
|
94
|
+
* Take a browser no session holds and no admission is about to out of the
|
|
95
|
+
* pool — synchronously, so the next call launches afresh — and say
|
|
96
|
+
* whether it did. The caller then closes it with `shutBrowser`.
|
|
97
|
+
*/
|
|
98
|
+
private retireIfUnused;
|
|
99
|
+
/** Close a browser no session holds and no admission is about to. */
|
|
100
|
+
private closeBrowserIfUnused;
|
|
78
101
|
/** Close whatever has been idle longer than the timeout. Returns what went. */
|
|
79
102
|
sweepIdle(now: number): Promise<string[]>;
|
|
80
103
|
/**
|
|
@@ -85,6 +108,8 @@ export declare class BrowserSessionPool {
|
|
|
85
108
|
private armSweep;
|
|
86
109
|
private disarmSweep;
|
|
87
110
|
private closeBrowser;
|
|
111
|
+
private retireBrowser;
|
|
112
|
+
private shutBrowser;
|
|
88
113
|
/** Everything, for shutdown. */
|
|
89
114
|
close(): Promise<void>;
|
|
90
115
|
/** How many conversations currently hold a page. */
|
package/dist/sessions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,YAAY,EAElB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAsB,aAAa,EAAe,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5F,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,cAAc,CAAA;KAAE,KAAK,IAAI,CAAC;IACzH,sFAAsF;IACtF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAkDD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAE7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAE7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAE5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4C;IAEtE,OAAO,CAAC,UAAU,CAA6B;IAE/C;;;;;;;;;OASG;IACH,OAAO,CAAC,SAAS,CAAuC;IAExD,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,kBAAkB;YAIzB,UAAU;IA4CxB;;;OAGG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,YAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;YAoB7E,KAAK;IAkFnB;;;;;;;;;;OAUG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKhD;;;OAGG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAaxC;;;;;OAKG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;YAqBrD,IAAI;IAsDlB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAQtB,qEAAqE;YACvD,oBAAoB;IAMlC,+EAA+E;IACzE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAS/C;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,WAAW;YAOL,YAAY;IAK1B,OAAO,CAAC,aAAa;YAOP,WAAW;IAYzB,gCAAgC;IAC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,oDAAoD;IACpD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,uEAAuE;IACvE,IAAI,YAAY,IAAI,MAAM,CAEzB;CACF"}
|
package/dist/sessions.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { originOf } from '@stratusagent/core';
|
|
1
2
|
import { chromiumProxyOptions, createEgressProxy, policyKeyFor, } from '@stratusagent/egress';
|
|
2
3
|
const DEFAULT_IDLE_MS = 5 * 60_000;
|
|
3
4
|
const DEFAULT_MAX_CONTEXTS = 4;
|
|
@@ -15,7 +16,8 @@ const MAX_SWEEP_INTERVAL_MS = 60_000;
|
|
|
15
16
|
* names, so it cannot narrow a hostname destination without re-opening
|
|
16
17
|
* the DNS-rebinding race the proxy exists to close.
|
|
17
18
|
* - **A context per conversation**, so two conversations never share a
|
|
18
|
-
* cookie jar or a login
|
|
19
|
+
* cookie jar or a login — and a proxy per context, under the same
|
|
20
|
+
* policy, so they never share a refusal log either.
|
|
19
21
|
* - **Nothing left running.** A context that has gone quiet is closed, and
|
|
20
22
|
* a browser whose last conversation went with it is closed too.
|
|
21
23
|
*
|
|
@@ -46,15 +48,22 @@ export class BrowserSessionPool {
|
|
|
46
48
|
}
|
|
47
49
|
async browserFor(policy) {
|
|
48
50
|
const key = policyKeyFor(policy);
|
|
51
|
+
// Claimed in the same tick as the lookup, before any await can let a
|
|
52
|
+
// release in: the caller owes an `admitting -= 1` for every entry
|
|
53
|
+
// returned here, whichever path produced it.
|
|
54
|
+
const claim = (entry) => {
|
|
55
|
+
entry.admitting += 1;
|
|
56
|
+
return entry;
|
|
57
|
+
};
|
|
49
58
|
const existing = this.browsers.get(key);
|
|
50
59
|
if (existing) {
|
|
51
|
-
return existing;
|
|
60
|
+
return claim(existing);
|
|
52
61
|
}
|
|
53
62
|
// Single-flight per policy: two calls arriving together must not launch
|
|
54
63
|
// two browsers, and the second would leak because only one is kept.
|
|
55
64
|
const pending = this.launching.get(key);
|
|
56
65
|
if (pending) {
|
|
57
|
-
return pending;
|
|
66
|
+
return pending.then(claim);
|
|
58
67
|
}
|
|
59
68
|
const launch = (async () => {
|
|
60
69
|
const proxy = await createEgressProxy(policy);
|
|
@@ -65,7 +74,7 @@ export class BrowserSessionPool {
|
|
|
65
74
|
...(this.options.executablePath ? { executablePath: this.options.executablePath } : {}),
|
|
66
75
|
...(this.options.channel ? { channel: this.options.channel } : {}),
|
|
67
76
|
});
|
|
68
|
-
const entry = { key, browser, proxy, sessions: new Set() };
|
|
77
|
+
const entry = { key, browser, proxy, sessions: new Set(), admitting: 0 };
|
|
69
78
|
this.browsers.set(key, entry);
|
|
70
79
|
this.armSweep();
|
|
71
80
|
return entry;
|
|
@@ -79,7 +88,7 @@ export class BrowserSessionPool {
|
|
|
79
88
|
}
|
|
80
89
|
})();
|
|
81
90
|
this.launching.set(key, launch);
|
|
82
|
-
return launch;
|
|
91
|
+
return launch.then(claim);
|
|
83
92
|
}
|
|
84
93
|
/**
|
|
85
94
|
* The page this session works in, created on first use — under the
|
|
@@ -115,74 +124,196 @@ export class BrowserSessionPool {
|
|
|
115
124
|
// belongs to a browser enforcing the old one, so it goes.
|
|
116
125
|
await this.drop(existing, 'policy');
|
|
117
126
|
}
|
|
127
|
+
// Claimed by `browserFor`: from here until the session is added below,
|
|
128
|
+
// a release of this browser's last session (an unresponsive page — the
|
|
129
|
+
// one pool change that does not queue behind admission, because the
|
|
130
|
+
// page it is giving up on already waited its full timeout) leaves the
|
|
131
|
+
// browser open for this context.
|
|
118
132
|
const entry = await this.browserFor(policy);
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
await this.drop(oldest, 'capacity');
|
|
126
|
-
}
|
|
127
|
-
const context = await entry.browser.newContext();
|
|
128
|
-
let page;
|
|
133
|
+
// The context's own proxy, under the same policy as the browser's, so
|
|
134
|
+
// what it refuses is this conversation's alone. Created inside the
|
|
135
|
+
// block below so a failure anywhere after it still closes it.
|
|
136
|
+
let proxy;
|
|
129
137
|
try {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
// a Chromium that died during page creation stops being handed to
|
|
138
|
-
// the next caller).
|
|
139
|
-
try {
|
|
140
|
-
await context.close();
|
|
138
|
+
const maxContexts = this.options.maxContexts ?? DEFAULT_MAX_CONTEXTS;
|
|
139
|
+
while (this.contexts.size >= maxContexts) {
|
|
140
|
+
const oldest = [...this.contexts.values()].sort((left, right) => left.lastUsedAt - right.lastUsedAt)[0];
|
|
141
|
+
if (!oldest) {
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
await this.drop(oldest, 'capacity');
|
|
141
145
|
}
|
|
142
|
-
|
|
143
|
-
|
|
146
|
+
proxy = await createEgressProxy(policy);
|
|
147
|
+
const context = await entry.browser.newContext({ proxy: chromiumProxyOptions(proxy) });
|
|
148
|
+
let page;
|
|
149
|
+
try {
|
|
150
|
+
page = await context.newPage();
|
|
144
151
|
}
|
|
145
|
-
|
|
146
|
-
|
|
152
|
+
catch (error) {
|
|
153
|
+
// A context that never got a page is not in `contexts`, so the idle
|
|
154
|
+
// sweep will never look at it — and neither will shutdown, which
|
|
155
|
+
// walks the same map. Closed here or not at all.
|
|
156
|
+
try {
|
|
157
|
+
await context.close();
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Already gone with the browser that owned it.
|
|
161
|
+
}
|
|
162
|
+
throw error;
|
|
147
163
|
}
|
|
148
|
-
|
|
164
|
+
this.contexts.set(sessionId, {
|
|
165
|
+
sessionId,
|
|
166
|
+
context,
|
|
167
|
+
page,
|
|
168
|
+
lastUsedAt: now,
|
|
169
|
+
browserKey: key,
|
|
170
|
+
proxy,
|
|
171
|
+
refusalsSeen: 0,
|
|
172
|
+
});
|
|
173
|
+
// Held by the session now; the `finally` below must not close it.
|
|
174
|
+
proxy = undefined;
|
|
175
|
+
entry.sessions.add(sessionId);
|
|
176
|
+
return page;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
entry.admitting -= 1;
|
|
180
|
+
// A proxy whose context never came to be is a listening socket
|
|
181
|
+
// nothing else would ever close.
|
|
182
|
+
await proxy?.close();
|
|
183
|
+
// A browser that nothing is using goes too — which is also how a
|
|
184
|
+
// Chromium that died during page creation stops being handed to the
|
|
185
|
+
// next caller. Never on the success path: the session was just added.
|
|
186
|
+
await this.closeBrowserIfUnused(entry);
|
|
149
187
|
}
|
|
150
|
-
this.contexts.set(sessionId, { sessionId, context, page, lastUsedAt: now, browserKey: key });
|
|
151
|
-
entry.sessions.add(sessionId);
|
|
152
|
-
return page;
|
|
153
188
|
}
|
|
154
189
|
/**
|
|
155
|
-
*
|
|
190
|
+
* The origin of the page this conversation is on, or nothing when it has
|
|
191
|
+
* no page or the page has no origin worth naming (`about:blank` before
|
|
192
|
+
* the first navigation, a context the idle sweep has closed).
|
|
156
193
|
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
194
|
+
* Synchronous, and it opens nothing. It is read while a call is being
|
|
195
|
+
* *judged*, before the tool runs — a lookup that could launch a browser
|
|
196
|
+
* would make the permission engine start one for a call it is about to
|
|
197
|
+
* refuse, and a page opened to answer "where are you" would answer
|
|
198
|
+
* `about:blank` every time in any case.
|
|
199
|
+
*/
|
|
200
|
+
originFor(sessionId) {
|
|
201
|
+
const context = this.contexts.get(sessionId);
|
|
202
|
+
return context ? originOf(context.page.url()) : undefined;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* What this session's own proxy refused — its conversation's, and no
|
|
206
|
+
* other's, whatever policy the two share.
|
|
162
207
|
*/
|
|
163
208
|
refusalsFor(sessionId) {
|
|
164
209
|
const context = this.contexts.get(sessionId);
|
|
165
210
|
if (!context) {
|
|
166
211
|
return [];
|
|
167
212
|
}
|
|
168
|
-
|
|
213
|
+
const { proxy } = context;
|
|
214
|
+
// Only what arrived since this conversation last looked, and each
|
|
215
|
+
// entry once: a report is a report, not a standing accusation.
|
|
216
|
+
const unseen = Math.min(proxy.refusalCount - context.refusalsSeen, proxy.refusals.length);
|
|
217
|
+
context.refusalsSeen = proxy.refusalCount;
|
|
218
|
+
return unseen > 0 ? proxy.refusals.slice(-unseen) : [];
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Close one conversation's context because its page stopped answering —
|
|
222
|
+
* a script that never yields holds `evaluate` and `title` forever, and
|
|
223
|
+
* the only way past it is a fresh page. Returns false when the session
|
|
224
|
+
* had no context to close.
|
|
225
|
+
*/
|
|
226
|
+
async release(sessionId, page) {
|
|
227
|
+
// Not through the admission queue: the caller has already waited the
|
|
228
|
+
// page's full timeout, and an admission ahead in the queue is bounded
|
|
229
|
+
// by nothing — a launch or `newContext` that hangs would hold this
|
|
230
|
+
// call, and the tool call above it, past any promise the timeout made.
|
|
231
|
+
// What the queue protected against, a browser closed under an
|
|
232
|
+
// admission that had chosen it, `BrowserEntry.admitting` covers.
|
|
233
|
+
//
|
|
234
|
+
// The page, when the caller names one, has to be the one the session
|
|
235
|
+
// still holds: the sweep may have dropped the page that timed out and a
|
|
236
|
+
// concurrent call opened a healthy replacement under the same id
|
|
237
|
+
// before the timeout fired, and that replacement is not what stopped
|
|
238
|
+
// answering.
|
|
239
|
+
const entry = this.contexts.get(sessionId);
|
|
240
|
+
if (!entry || (page !== undefined && entry.page !== page)) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
await this.drop(entry, 'unresponsive');
|
|
244
|
+
return true;
|
|
169
245
|
}
|
|
170
246
|
async drop(entry, reason) {
|
|
247
|
+
// Only the context the pool still holds for this session. The idle
|
|
248
|
+
// sweep and shutdown work from a snapshot and await each drop in turn,
|
|
249
|
+
// so by the time they reach an entry, that session may have timed out,
|
|
250
|
+
// been released, and opened a replacement under the same id — and
|
|
251
|
+
// the state keyed by that id is the replacement's now, not this one's.
|
|
252
|
+
if (this.contexts.get(entry.sessionId) !== entry) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
171
255
|
this.contexts.delete(entry.sessionId);
|
|
256
|
+
// Ownership goes before the close, not after it. A close that outlasts
|
|
257
|
+
// the teardown bound in `answeredWithin` settles after this session has
|
|
258
|
+
// opened a replacement context in the same browser, under the same id;
|
|
259
|
+
// taking "its" session out of the set then would take the replacement's,
|
|
260
|
+
// and close the browser under it.
|
|
261
|
+
this.browsers.get(entry.browserKey)?.sessions.delete(entry.sessionId);
|
|
262
|
+
// Reported here too, before the close rather than after it: the
|
|
263
|
+
// eviction is the pool forgetting the context, which has just happened,
|
|
264
|
+
// and a listener keying per-session state on it (the plugin's list of
|
|
265
|
+
// what a page was refused) must clear that state before the next call
|
|
266
|
+
// — which opens a replacement the moment this returns — not when a
|
|
267
|
+
// close that may never settle does, and never after the replacement
|
|
268
|
+
// has state of its own under the same id.
|
|
172
269
|
try {
|
|
173
|
-
|
|
270
|
+
this.options.onEvicted?.({ sessionId: entry.sessionId, reason });
|
|
174
271
|
}
|
|
175
|
-
catch {
|
|
176
|
-
// A
|
|
272
|
+
catch (error) {
|
|
273
|
+
// A listener's failure is its own; the context and browser below are
|
|
274
|
+
// no longer tracked anywhere and would leak if it stopped this drop.
|
|
275
|
+
this.options.onError?.(error);
|
|
177
276
|
}
|
|
277
|
+
// The browser goes with its last conversation: a Chromium sitting idle
|
|
278
|
+
// overnight is the leak this pack is most likely to cause. Retired from
|
|
279
|
+
// the pool now, in the same step, and closed alongside the context
|
|
280
|
+
// rather than after it: a context whose close never settles (the case
|
|
281
|
+
// `answeredWithin` stops waiting on) would otherwise leave a possibly
|
|
282
|
+
// wedged browser registered for the next call to be handed, when that
|
|
283
|
+
// call was promised a fresh one.
|
|
178
284
|
const browser = this.browsers.get(entry.browserKey);
|
|
179
|
-
browser
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
285
|
+
const retired = browser !== undefined && this.retireIfUnused(browser);
|
|
286
|
+
const closingContext = Promise.all([
|
|
287
|
+
entry.context.close().catch(() => {
|
|
288
|
+
// A context that is already gone is the outcome we wanted.
|
|
289
|
+
}),
|
|
290
|
+
// The context's own proxy goes with it, and alongside rather than
|
|
291
|
+
// after: a context close that never settles must not hold a
|
|
292
|
+
// listening socket open behind it.
|
|
293
|
+
entry.proxy.close().catch(() => undefined),
|
|
294
|
+
]);
|
|
295
|
+
if (retired && browser) {
|
|
296
|
+
await this.shutBrowser(browser);
|
|
297
|
+
}
|
|
298
|
+
await closingContext;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Take a browser no session holds and no admission is about to out of the
|
|
302
|
+
* pool — synchronously, so the next call launches afresh — and say
|
|
303
|
+
* whether it did. The caller then closes it with `shutBrowser`.
|
|
304
|
+
*/
|
|
305
|
+
retireIfUnused(entry) {
|
|
306
|
+
if (entry.sessions.size === 0 && entry.admitting === 0 && this.browsers.get(entry.key) === entry) {
|
|
307
|
+
this.retireBrowser(entry);
|
|
308
|
+
return true;
|
|
309
|
+
}
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
/** Close a browser no session holds and no admission is about to. */
|
|
313
|
+
async closeBrowserIfUnused(entry) {
|
|
314
|
+
if (this.retireIfUnused(entry)) {
|
|
315
|
+
await this.shutBrowser(entry);
|
|
184
316
|
}
|
|
185
|
-
this.options.onEvicted?.({ sessionId: entry.sessionId, reason });
|
|
186
317
|
}
|
|
187
318
|
/** Close whatever has been idle longer than the timeout. Returns what went. */
|
|
188
319
|
async sweepIdle(now) {
|
|
@@ -216,18 +347,26 @@ export class BrowserSessionPool {
|
|
|
216
347
|
}
|
|
217
348
|
}
|
|
218
349
|
async closeBrowser(entry) {
|
|
350
|
+
this.retireBrowser(entry);
|
|
351
|
+
await this.shutBrowser(entry);
|
|
352
|
+
}
|
|
353
|
+
retireBrowser(entry) {
|
|
219
354
|
this.browsers.delete(entry.key);
|
|
220
|
-
try {
|
|
221
|
-
await entry.browser.close();
|
|
222
|
-
}
|
|
223
|
-
catch {
|
|
224
|
-
// Same as a context: already gone is fine.
|
|
225
|
-
}
|
|
226
|
-
await entry.proxy.close();
|
|
227
355
|
if (this.browsers.size === 0) {
|
|
228
356
|
this.disarmSweep();
|
|
229
357
|
}
|
|
230
358
|
}
|
|
359
|
+
async shutBrowser(entry) {
|
|
360
|
+
// The proxy alongside the browser, not after it: a browser whose close
|
|
361
|
+
// never settles is exactly the one being retired here, and its proxy
|
|
362
|
+
// is a listening socket nothing else would ever close.
|
|
363
|
+
await Promise.all([
|
|
364
|
+
entry.browser.close().catch(() => {
|
|
365
|
+
// Same as a context: already gone is fine.
|
|
366
|
+
}),
|
|
367
|
+
entry.proxy.close(),
|
|
368
|
+
]);
|
|
369
|
+
}
|
|
231
370
|
/** Everything, for shutdown. */
|
|
232
371
|
async close() {
|
|
233
372
|
this.closed = true;
|
package/dist/sessions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stratusagent/tool-browser",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -19,14 +19,14 @@
|
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"playwright-core": "^1.49.0",
|
|
22
|
-
"@stratusagent/core": "0.
|
|
23
|
-
"@stratusagent/plugins": "0.
|
|
24
|
-
"@stratusagent/egress": "0.
|
|
22
|
+
"@stratusagent/core": "0.11.1",
|
|
23
|
+
"@stratusagent/plugins": "0.11.1",
|
|
24
|
+
"@stratusagent/egress": "0.11.1"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^24.6.0",
|
|
28
28
|
"typescript": "^5.9.3",
|
|
29
|
-
"@stratusagent/tool-web": "0.
|
|
29
|
+
"@stratusagent/tool-web": "0.11.1"
|
|
30
30
|
},
|
|
31
31
|
"license": "MIT",
|
|
32
32
|
"repository": {
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
},
|
|
67
67
|
{
|
|
68
68
|
"name": "browser.act",
|
|
69
|
-
"risk": "
|
|
69
|
+
"risk": "gated"
|
|
70
70
|
}
|
|
71
71
|
]
|
|
72
72
|
},
|