Features
-
Persistent browser auth profiles:
browser_opennow accepts anauthProfileparameter to reuse signed-in browser state across sessions. Omitting the field uses the nameddefaultprofile on supported providers; passauthProfile: falsefor a fresh incognito session.// Reuse a named profile await toolkit.tools.browser_open.execute({ authProfile: "work" }); // Incognito session await toolkit.tools.browser_open.execute({ authProfile: false });
Named profiles are supported on the Local, Libretto Cloud, Kernel, and Browser Use providers. Browserbase and Steel are unsupported until a durable name-to-ID mapping is available. Local profiles are stored under
~/.libretto/browser-tools/profileswith owner-only permissions. Changes persist only afterbrowser_closeor a gracefuldispose(). -
Account deletion controls: Workspace owners can now delete their Libretto Cloud account (and workspace, when they are the sole member) from the Users tab of the dashboard. A confirmation dialog is shown before any destructive action.
Improvements
-
Modal-scoped accessibility snapshots: When a modal dialog is open (
<dialog>,role="dialog" aria-modal="true", orrole="alertdialog" aria-modal="true"), the accessibility snapshot now roots at the modal instead of the full page. This prevents inert background content from cluttering the tree and ensures agents see only the focus-trapped UI.Before — page behind the modal stayed in the tree:
<document> <main> # Checkout <button>Pay now</button> </main> Delete this item? <button>Cancel</button> </document>After — modal is the root:
<dialog> Confirm delete Delete this item? <button>Cancel</button> <button>Delete</button> </dialog> -
Opt-in snapshot diffs on
exec: Accessibility-tree diffs afterbrowser_exec/libretto execare now opt-in. PassdiffSnapshot: true(tool) or--diff-snapshot(CLI) when you want a before/after page-change diff after an exploratory mutation. Skipping the flag avoids the cost of two snapshot captures on every exec.// Only capture a diff when you need it await toolkit.tools.browser_exec.execute({ sessionId, code: "await page.locator('button').click()", diffSnapshot: true, });
npx libretto exec --diff-snapshot "await page.locator('button').click()"
-
snapshot <ref>always captures a fresh tree: Scoped snapshots no longer depend on a cached tree from a prior full snapshot. Eachsnapshot <ref>call now captures a fresh screenshot and accessibility tree, then scopes the output to that ref. -
Portable daemon IPC endpoints: The daemon now uses
os.tmpdir()for socket paths on Linux (instead of a hardcoded/tmp), keeps macOS on the short/tmppath to stay within its 104-byte Unix socket limit, and correctly prefers UID-based endpoint isolation over username on Unix systems. Windows named pipe behavior is unchanged. -
Cleanup errors as values:
dispose(),closeSession(), andbrowser_closeno longer throw on provider or browser cleanup failures. Errors are returned as typed values (BrowserCleanupError | null), so partial failures are surfaced to callers without masking the original error or leaving sessions in an unknown state.