@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 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` | `dangerous` | Always a human, in every mode. A click submits, buys, and deletes — navigating somewhere else undoes a `goto`, and nothing undoes a click. |
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 per action. |
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
  }
@@ -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;QAAE,QAAQ,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpG,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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAsD3D;;;;;;;;;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"}
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 { JsonObject, Plugin } from '@stratusagent/core';
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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,EAAiB,MAAM,oBAAoB,CAAC;AAEvF,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;AA0PD,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;CAgEhF,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,YAAY,GAAI,SAAQ,UAAe,KAAG,MAAqC,CAAC"}
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 { assertRequestAllowed } from '@stratusagent/egress';
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
- /** The address policy a block describes, per-agent or top-level. */
21
- const policyFrom = (resolved) => ({
22
- ...(resolved.allowPrivateAddresses === true ? { allowPrivateAddresses: true } : {}),
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 = policyFrom(resolved);
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 refusalsFor = (runtime, session) => [
82
- ...(runtime.blocked.get(session.id) ?? []),
83
- ...runtime.pool.refusalsFor(session.id),
84
- ].slice(-10);
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: await page.title(),
126
- ...(refusalsFor(runtime, session).length > 0
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 : '', asNumber(input.maxBytes, settings.maxTextBytes));
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: await page.title(),
223
+ title,
151
224
  text,
152
225
  truncated,
153
- ...(refusalsFor(runtime, session).length > 0
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
- return { file: target, url: page.url(), title: await page.title() };
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
- // Dangerous, and the only one here that is: navigating and reading can
188
- // be undone by navigating somewhere else, while a click submits, buys,
189
- // and deletes. No selector makes that reversible.
190
- risk: 'dangerous',
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
- return { action: input.action, selector, url: page.url(), title: await page.title() };
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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"}
@@ -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
- * What the proxy refused for this session's browser.
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
- * Scoped to the browser rather than to the process: an agent under a
71
- * different policy has a different browser and never sees these. Two
72
- * agents that share a policy share a browser and can see each other's
73
- * refused *addresses* — which is the same set their identical policy
74
- * already told them about.
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. */
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"AAAA,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,CAAA;KAAE,KAAK,IAAI,CAAC;IACxG,sFAAsF;IACtF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAqBD;;;;;;;;;;;;;;;;;;;;GAoBG;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;IAqCxB;;;OAGG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,YAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;YAoB7E,KAAK;IAyDnB;;;;;;;;OAQG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;YAQ1B,IAAI;IAiBlB,+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;IAa1B,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"}
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
- const maxContexts = this.options.maxContexts ?? DEFAULT_MAX_CONTEXTS;
120
- while (this.contexts.size >= maxContexts) {
121
- const oldest = [...this.contexts.values()].sort((left, right) => left.lastUsedAt - right.lastUsedAt)[0];
122
- if (!oldest) {
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
- page = await context.newPage();
131
- }
132
- catch (error) {
133
- // A context that never got a page is not in `contexts`, so the idle
134
- // sweep will never look at it — and neither will shutdown, which
135
- // walks the same map. Closed here or not at all, and the browser
136
- // goes too when it turns out nothing is using it (which is also how
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
- catch {
143
- // Already gone with the browser that owned it.
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
- if (entry.sessions.size === 0) {
146
- await this.closeBrowser(entry);
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
- throw error;
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
- * What the proxy refused for this session's browser.
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
- * Scoped to the browser rather than to the process: an agent under a
158
- * different policy has a different browser and never sees these. Two
159
- * agents that share a policy share a browser and can see each other's
160
- * refused *addresses* — which is the same set their identical policy
161
- * already told them about.
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
- return this.browsers.get(context.browserKey)?.proxy.refusals ?? [];
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
- await entry.context.close();
270
+ this.options.onEvicted?.({ sessionId: entry.sessionId, reason });
174
271
  }
175
- catch {
176
- // A context that is already gone is the outcome we wanted.
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?.sessions.delete(entry.sessionId);
180
- if (browser && browser.sessions.size === 0) {
181
- // The browser goes with its last conversation: a Chromium sitting
182
- // idle overnight is the leak this pack is most likely to cause.
183
- await this.closeBrowser(browser);
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;
@@ -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.10.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.10.0",
23
- "@stratusagent/plugins": "0.10.0",
24
- "@stratusagent/egress": "0.10.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.10.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": "dangerous"
69
+ "risk": "gated"
70
70
  }
71
71
  ]
72
72
  },