@trusty-squire/mcp 1.1.14-rc.3 → 1.1.14-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +50 -99
  2. package/{LICENSE → assets/licenses/browser-use-MIT.txt} +1 -1
  3. package/dist/bot/browser-use-capture.d.ts +15 -0
  4. package/dist/bot/browser-use-capture.d.ts.map +1 -0
  5. package/dist/bot/browser-use-capture.js +488 -0
  6. package/dist/bot/browser-use-capture.js.map +1 -0
  7. package/dist/bot/browser-use-serializer.d.ts +60 -0
  8. package/dist/bot/browser-use-serializer.d.ts.map +1 -0
  9. package/dist/bot/browser-use-serializer.js +587 -0
  10. package/dist/bot/browser-use-serializer.js.map +1 -0
  11. package/dist/bot/browser.d.ts +4 -9
  12. package/dist/bot/browser.d.ts.map +1 -1
  13. package/dist/bot/browser.js +10 -93
  14. package/dist/bot/browser.js.map +1 -1
  15. package/dist/bot/compact-observation-v2.d.ts +16 -51
  16. package/dist/bot/compact-observation-v2.d.ts.map +1 -1
  17. package/dist/bot/compact-observation-v2.js +129 -126
  18. package/dist/bot/compact-observation-v2.js.map +1 -1
  19. package/dist/bot/provision-session.d.ts +4 -1
  20. package/dist/bot/provision-session.d.ts.map +1 -1
  21. package/dist/bot/provision-session.js +117 -137
  22. package/dist/bot/provision-session.js.map +1 -1
  23. package/dist/bot/session/lifecycle.d.ts.map +1 -1
  24. package/dist/bot/session/lifecycle.js +0 -1
  25. package/dist/bot/session/lifecycle.js.map +1 -1
  26. package/dist/server.d.ts +1 -1
  27. package/dist/server.d.ts.map +1 -1
  28. package/dist/server.js +1 -1
  29. package/dist/tools/index.js +2 -2
  30. package/dist/tools/index.js.map +1 -1
  31. package/dist/tools/provision-drive.d.ts +231 -526
  32. package/dist/tools/provision-drive.d.ts.map +1 -1
  33. package/dist/tools/provision-drive.js +372 -1081
  34. package/dist/tools/provision-drive.js.map +1 -1
  35. package/dist/tools/use-credential.d.ts +6 -6
  36. package/package.json +1 -1
package/README.md CHANGED
@@ -140,10 +140,10 @@ filled fields while the agent advances to the review step and places the order;
140
140
  those fields are ordinary page content in `operate_observe` and
141
141
  `operate_screenshot`, not masked. Verify the live final total against the approved
142
142
  `amount_cents`/currency yourself before placing the order; Trusty Squire no longer
143
- re-reads the total or submits anything. For `click` and `js_click`, a control whose
143
+ re-reads the total or submits anything. For `operate_click`, a control whose
144
144
  label looks like pay/place-order may fire only once for that approval. A second
145
145
  recognized attempt is refused and requires a fresh `operate_pay` approval in a new
146
- session. Non-charge-labeled clicks, key presses, and `oauth_click` remain ungated.
146
+ session. Non-charge-labeled clicks, key presses, and OAuth controls remain ungated.
147
147
  After a recognized click dispatches, Trusty Squire best-effort records a secret-free
148
148
  `payment_place_order_attempted` Activity event bound to the approval, optional
149
149
  mandate, approved amount/currency, merchant, and opaque card reference. This records
@@ -215,7 +215,7 @@ remote CDP, macOS, and Windows operator sessions are not supported in this migra
215
215
  opens its own fresh browser profile and restores the snapshot's non-Google
216
216
  signed-in state, so independent sessions can run concurrently without opening
217
217
  the canonical login profile. Google state is restored inside the serialized
218
- `oauth_login` or legacy `oauth_click` boundary; sanctioned Gmail verification
218
+ `operate_login` boundary; sanctioned Gmail verification
219
219
  uses a separate temporary identity browser.
220
220
  3. If the flow produces an API key or client secret, Trusty Squire captures it
221
221
  into the vault without returning the raw value through its credential tools.
@@ -293,13 +293,16 @@ for the system and data flows.
293
293
 
294
294
  ## MCP tools
295
295
 
296
- The default MCP registry exposes 20 tools. The essential operator surface is
297
- `operate_start`, `operate_observe`, `operate_observe_query`, `operate_act`,
298
- `operate_pay`, `operate_payment_status`, `operate_finish`,
299
- `operate_recipe_run`, and `operate_recipe_save` — every former standalone
300
- workflow/lifecycle/login tool name was dropped and its behavior folded into
301
- `operate_act` as a `kind` (or into `operate_finish`'s `outcome`); no delegating
302
- aliases remain. Continue a pending pre-charge approval by re-calling
296
+ The default MCP registry exposes 29 tools (31 when maintainer diagnostics are
297
+ enabled). The 18-tool operator driving surface uses flat, single-purpose verbs:
298
+ `operate_start`, `operate_finish`, `operate_observe`, `operate_screenshot`,
299
+ `operate_navigate`, `operate_click`, `operate_type`, `operate_select`,
300
+ `operate_press`, `operate_scroll`, `operate_allow_host`, `operate_login`,
301
+ `operate_fill_credential`, `operate_extract`, `operate_pay`,
302
+ `operate_payment_status`, `list_credentials`, and `list_payment_cards`.
303
+ Recipe and vault/account tools remain separate surfaces. The complete migration
304
+ table and input contracts are in [operator-tool-surface.md](docs/operator-tool-surface.md).
305
+ Continue a pending pre-charge approval by re-calling
303
306
  `operate_pay` with the same arguments; use
304
307
  `operate_payment_status(wait_seconds)` as a non-charging alternative and for
305
308
  post-submit outcome checks. `operate_screenshot(session_id,
@@ -312,55 +315,40 @@ DOM-diagnostics pair is excluded from that surface; set
312
315
  `TRUSTY_SQUIRE_DIAGNOSTICS=1` in the MCP server environment to opt into the
313
316
  22-tool diagnostics profile.
314
317
 
315
- Operate sessions default to Compact V2 observations: a compact
316
- `format:"compact-v2"` response with the live page URL, a finite stage,
317
- title/heading semantics, and generation-bound controls in `safe_table`. Labels,
318
- semantics, and page content are the page's own copy, unscreened — the one
319
- exception is the label alias, which screens credential-shaped accessible names
320
- to `@redacted-secret` (see [observation-model.md §4.5](docs/observation-model.md)).
321
- Page text, DOM values, and snapshot files are omitted as a SIZE budget,
322
- not as a seal; read a value off the page with `operate_screenshot`, `operate_act
323
- { kind: "extract" }`, or a V1 session. Use
324
- `operate_observe_query` with task words or `overflow.next_cursor` to retrieve a
325
- named or paged control while matching stays inside the live browser. A browser
326
- action invalidates the current handles; on `reobserve_required`, observe again
327
- and select a new handle. Exact cursorless `Google` and `GitHub` queries briefly
328
- refresh controls that hydrate or gain labels after the initial observation, but
329
- still return only a current handle. `detail:"full"` keeps the V2 format. Maintainers can select the legacy V1 `el_table`/snapshot contract with
330
- `TRUSTY_SQUIRE_OBSERVE_V2=off`, or exercise V2 without emitting it with
331
- `shadow`; the detailed wire and migration contract lives in
332
- [DESIGN-observe-compact.md](docs/DESIGN-observe-compact.md).
318
+ Operate sessions default to Compact V2 observations: a `format:"compact-v2"`
319
+ response with the live page URL, stage, stable `@e:` refs, and a tab-indented
320
+ `dom` tree that interleaves visible page text with interactive controls. Names
321
+ and text are page content except for the narrow secret-shaped substring screen;
322
+ it preserves the DOM structure and refs (see
323
+ [observation-model.md §4.5](docs/observation-model.md)). Each observation says
324
+ whether more content is reachable above or below the viewport. Use
325
+ `operate_observe` with `query` to find controls anywhere in the live document,
326
+ including below the fold, then scroll or act on a returned actionable ref. A
327
+ browser action can require re-observation before a ref is used again.
328
+ `detail:"full"` keeps the V2 format. Maintainers can select the legacy V1
329
+ `el_table`/snapshot contract with `TRUSTY_SQUIRE_OBSERVE_V2=off`, or exercise V2
330
+ without emitting it with `shadow`; the detailed Compact V2 contract lives in
331
+ [browser-use-serializer-port.md](docs/browser-use-serializer-port.md).
333
332
 
334
333
  - Rejected tool calls return a JSON `error` envelope with a stable `code` and
335
334
  message. Malformed and unknown calls fail only that request; they do not stop
336
335
  the shared stdio process or discard its active in-memory operator session.
337
336
  `server_unavailable` includes `retry.max_attempts: 1`: retry once, and never
338
337
  kill or restart the shared operator process.
339
- - `operate_start`, `operate_observe`, `operate_observe_query`, and `operate_act`
340
- open a website, inspect the current state, and perform one browser action at a time. Ordinary controls
341
- inside same- and cross-origin frames are included in observations (as finite
342
- frame facts in Compact V2 and `frame_origin` in V1); known captcha challenge
343
- frames stay behind the dedicated captcha flow. Same-registrable-domain frames
344
- are reachable, cross-domain frames
345
- must pass the same domain scope as `goto`/`allow_host`, opaque frames are
346
- refused, and `type_secret` never targets any cross-domain frame. Frame refs
347
- currently support `click`, `js_click`, `type`, `type_secret`, and `select`;
348
- `upload`, `oauth_click`, and `oauth_login` fail closed. If a visible control
349
- has no observed ref, explicitly selected V1 sessions let the four
350
- locator-capable actions (`click`, `js_click`, `type`, and `type_secret`) use a
351
- live `text=…`/`css=…` locator; that one-off fallback is not replayable.
352
- Compact V2 accepts only a handle from its current sealed action map.
353
- When a `click` or `js_click` opens a new tab or popup (`target=_blank`, a
354
- `window.open` control), the operator follows it the way a person would only
355
- when the browser attributes its creation to the session's active page. That
356
- owned popup becomes the active page, so the next `operate_observe` or
357
- `operate_act` reads it. An unrelated or no-opener page in the browser context
358
- stays unassigned and cannot become the working page. This is how an emailed
359
- verification or magic link is followed. Do not try to `extract` the link's href
360
- instead — a single-use login token is sealed and is never returned as text;
361
- following the tab navigates the browser without exposing it. Payment is
362
- excluded: during a sealed card fill or a live place-order/3-D Secure approval
363
- the active page never changes.
338
+ - `operate_start` opens a scoped website session and `operate_observe` reads its
339
+ current state. Drive ordinary controls with `operate_click`, `operate_type`,
340
+ `operate_select`, `operate_press`, and `operate_scroll`; use
341
+ `operate_navigate` for scoped navigation. Acting tools target a current `ref`.
342
+ `operate_type` accepts either literal `text` or a protected session `slot`,
343
+ never both. `operate_click` alone may use its guarded internal DOM-dispatch
344
+ fallback after a proven non-dispatch; it is not a public alternative action.
345
+ Frame scope and stale-ref handling remain fail-closed. An owned popup becomes
346
+ the active page; unrelated/no-opener pages do not. Use `operate_login` for
347
+ atomic OAuth and the username/password lifecycle, `operate_extract` to capture
348
+ credentials, and `operate_fill_credential` to load protected slots. CAPTCHA
349
+ solving, inbox polling, local upload, and specialized cart mutation are not
350
+ operator verbs; inspect and drive the page's ordinary UI or hand the task back
351
+ to the user.
364
352
  In a live operator session, in-page XHR/fetch calls to merchant API sibling
365
353
  subdomains are automatically in scope only when they share the registrable
366
354
  domain of a host trusted at session start. Calls outside the session scope fail
@@ -383,13 +371,12 @@ still return only a current handle. `detail:"full"` keeps the V2 format. Maintai
383
371
  current handle. Under V1, DOM churn returns `target_stale` with the last
384
372
  observation generation, `reobserve_required: true`, best-effort label-keyed
385
373
  `replacement_candidates`, and `retry_policy: "do_not_retry_old_ref"`.
386
- Malformed `operate_act` calls return `error.code: "invalid_arguments"` and an
387
- `error.guidance` repair object with the allowed kinds, missing fields, a valid
388
- example, and a safe alternative instead of only a validation string.
389
- For a provider login, pass the observed provider-button ref to the atomic
390
- `oauth_login` action. It retains the product tab across provider-owned popup
374
+ Malformed flat-verb calls return `error.code: "invalid_arguments"` without
375
+ ending the shared server process or discarding the active session. For a
376
+ provider login, pass the observed provider-button ref to `operate_login`.
377
+ It retains the product tab across provider-owned popup
391
378
  redirects and closes, then returns the post-login product observation even if
392
- `detail` is `none`. Every `oauth_login` and legacy `oauth_click` is serialized
379
+ `detail` is `none`. Every OAuth login is serialized
393
380
  from action start through completion and a short release cooldown; other
394
381
  session work remains parallel. The whole serialized action has a 30-second
395
382
  deadline. If the provider has not handed control back in time, the call does
@@ -399,48 +386,13 @@ still return only a current handle. `detail:"full"` keeps the V2 format. Maintai
399
386
  2FA/verification challenge is usually still showing, so re-observe and drive
400
387
  it; the session stays open and usable. A denial the provider actually
401
388
  reported (an OAuth `error=` code on the return URL) is the one case that
402
- fails the action, with that code in the message. `oauth_click` and
403
- `oauth_settle` remain for
404
- legacy replay compatibility. If an observation races that legacy transition,
405
- the response reports `oauth.state: "in_progress"` and directs the host to
389
+ fails the action, with that code in the message. If an observation races the
390
+ transition, it reports `oauth.state: "in_progress"` and directs the host to
406
391
  observe again.
407
- - `operate_act` also owns eight consolidated workflow/lifecycle kinds — the
408
- entire operator surface beyond navigation, payment, finish, and recipe
409
- replay is reached through `operate_act`'s `kind`:
410
- - `select_many` accepts an ordered label/ref-to-option map for coupled
411
- variant, shipping, or similar selectors. It applies selections
412
- sequentially, re-observes after every success, tolerates partial failure,
413
- and returns each field's `selected` or `failed` outcome plus a current
414
- observation.
415
- - `cart_add` is the retry-safe add-to-cart path. Give it the canonical
416
- product identity, selected-variant options hash, and a stable idempotency
417
- key; it post-verifies the exact cart line and returns `added` or
418
- `already_in_cart`, `cart_delta` (`+1`, `0`, or `unknown`), and the canonical
419
- cart URL when observable, without clicking again for the same product and
420
- variant. Cart and checkout observations expose an informational,
421
- best-effort `checkout_state` with stage, product and variant identity,
422
- quantity, separately observed subtotal and shipping, payable total when
423
- known, canonical cart URL, and one `next_action`. The `single` and
424
- `fill_card` payment phases derive their authoritative approval amount
425
- independently of this state, preferring live checkout data according to the
426
- payment guide above.
427
- - `extract` captures a generated credential into a sealed slot or the vault.
428
- - `solve_captcha` drives the in-session captcha gate and returns the
429
- fail-fast `needs_user` handoff when it cannot be cleared.
430
- - `await_verification` reads the user's own inbox for an email verification
431
- code/link by default, with sender-scoped search and sealed-OTP transfer
432
- through `into_slot`. Advanced configuration or
433
- `grant_inbox_consent:false` can opt out.
434
- - `login_prepare_signup`, `login_store_signup`, and `login_load_saved` own
435
- the sealed username/password lifecycle. `login_prepare_signup` seals the
436
- user's captured email and a generated password, `login_store_signup`
437
- vaults those slots with explicit login-host policy, and `login_load_saved`
438
- retrieves an allowed saved login through encrypted browser-fill into
439
- sealed session slots. Raw values never enter the tool result.
440
392
  - Observed card controls are marked `payment_field` and
441
393
  `interaction: "vaulted_card_only"`, with `operate_pay { phase: "fill_card" }`
442
394
  as the recommended action. Typing a Luhn-valid, card-number-shaped value
443
- manually through `operate_act` is refused with `safe_alternative: "operate_pay"`
395
+ manually through `operate_type` is refused with `safe_alternative: "operate_pay"`
444
396
  and the missing prerequisite `verified_cart_total`.
445
397
  - `operate_finish` closes the session and optionally accepts a nested `outcome`.
446
398
  `none` only closes; `credentials` requires `store` and preserves credential
@@ -479,8 +431,7 @@ still return only a current handle. `detail:"full"` keeps the V2 format. Maintai
479
431
  `operate_payment_status` follows the [payment guide](#one-prompt) bounded-wait
480
432
  contract. It returns the session ID and includes it in every follow-up tool
481
433
  hint, so an approval or submitted outcome is always observed in its originating
482
- browser. Malformed calls return the same
483
- `error.guidance` repair fields as `operate_act`, including a safe resolution
434
+ browser. Malformed calls return normal `invalid_arguments` handling, including a safe resolution
484
435
  when `card_ref` and `card_label` conflict.
485
436
  - `list_credentials` and `use_credential` find saved credentials and make authenticated API calls without returning raw values.
486
437
  - `fetch_credential` returns a credential's raw value to the agent — the one path that does. It first returns an approval link and no value; you open it and sign with your passkey; the agent resumes with the returned `approval_id` and receives the value once. Denial or expiry releases nothing, and a mutation or payment approval cannot be used here. Reach for it only when the key must land somewhere the agent controls (a GitHub Actions secret, a `.env`) with no server-side injection path — `use_credential` is the right tool for calling an API.
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Trusty Squire
3
+ Copyright (c) 2024 Gregor Zunic
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,15 @@
1
+ import type { Frame, Page } from "playwright";
2
+ import type { InteractiveElement } from "./browser.js";
3
+ import { type BrowserUseNode } from "./browser-use-serializer.js";
4
+ export interface BrowserUseCapture {
5
+ root: BrowserUseNode;
6
+ elements: InteractiveElement[];
7
+ nodeElements: Map<string, InteractiveElement>;
8
+ moreAbove: boolean;
9
+ moreBelow: boolean;
10
+ }
11
+ /** Capture the three canonical Chrome trees. No page mutation and no Python runtime. */
12
+ export declare function captureBrowserUseDOM(page: Page, existing: readonly InteractiveElement[], framePath: (frame: Frame) => string | null, frameSecurity: (frame: Frame) => Promise<{
13
+ opaque: boolean;
14
+ }>): Promise<BrowserUseCapture>;
15
+ //# sourceMappingURL=browser-use-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-use-capture.d.ts","sourceRoot":"","sources":["../../src/bot/browser-use-capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAmB1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,6BAA6B,CAAC;AAsBrC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC9C,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAGD,wFAAwF;AACxF,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,SAAS,kBAAkB,EAAE,EACvC,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG,IAAI,EAC1C,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,GAC5D,OAAO,CAAC,iBAAiB,CAAC,CAyf5B"}