browser-skill ยท diff

git:20260822.cad0b5c to git:20260829.5df9314

93 added, 218 removed. Audit A to A.

---
name: browser-skill
- description: |
- Use the injected browser_* tools to automate the user's logged-in Chromium
- browser in a managed Agent Window.
+ description: Browser automation through six injected domain tools.
---
# browser-skill for DeepSeek Harness
- Drive the user's real Chromium browser through the structured `browser_*` tools provided by this
+ Drive the user's real Chromium browser through the six structured domain tools provided by this
plugin. The browser keeps the user's existing logins and cookies while isolating automation in an
- Agent Window. Use the tool schemas exactly as exposed by DeepSeek Harness; arguments are structured
- fields, not command-line flags.
+ Agent Window. Every call must include the tool's `action` field; other fields depend on that action.
## Tool availability
- Loading this skill reveals the browser tools for the rest of the conversation. If the tools were
- hidden before this skill was loaded, start browser work only after the skill invocation succeeds.
-
- All browser operations must use the injected tools directly. Do not translate the examples in this
- document into terminal commands or invoke another process to control the browser. Direct tool calls
- preserve session ownership, the live observation window, tool cards, cancellation, and cleanup.
-
- ## When to use
+ Loading this skill reveals the browser tools for the rest of the conversation. All browser work
+ must use the injected tools directly. Do not invoke another process to control the browser. Direct
+ tool calls preserve session ownership, the live observation window, cancellation, attachments, and
+ cleanup.
- - Visit and read pages that require the user's existing browser session.
- - Fill forms, select options, click through bounded flows, or smoke-test a web UI.
- - Inspect tabs, page structure, screenshots, console messages, or network metadata.
- - Work with a user tab after explicitly borrowing it into the Agent Window.
+ The six tools are:
- Do not use browser automation for tasks that need only local files, a purpose-built API, or an
- explanation. Never extract credentials, cookies, tokens, or other secrets. Do not keep control of a
- personal tab longer than the immediate task requires.
+ - `browser_session`: start, stop, or list plugin-owned sessions.
+ - `browser_page`: navigate, back, forward, reload, or wait for navigation.
+ - `browser_inspect`: observe, snapshot, html, screenshot, console, or network.
+ - `browser_interact`: click, hover, fill, select, or press.
+ - `browser_tabs`: list, create, select, close, borrow, or return tabs.
+ - `browser_assist`: resize the Agent Window, emulate a device, or request help from the user.
## Mandatory workflow
Every browser task follows this lifecycle:
- 1. Call `browser_session_start` and retain its returned `sessionId`.
- 2. Use that session for every browser operation. Pass `session` explicitly when more than one
- session exists.
- 3. Call `browser_session_stop` when the bounded goal is reached or an error ends the task. Treat
- cleanup like a `finally` path unless the user explicitly asks to keep the session open.
+ 1. Call `browser_session` with `action: "start"` and retain its returned `sessionId`.
+ 2. Use that session for every later call. Pass `session` explicitly when more than one exists.
+ 3. Call `browser_session` with `action: "stop"` when the goal is reached or an error ends the task.
+ Treat cleanup like a finally path unless the user explicitly asks to keep the session open.
- Conceptual tool-call sequence:
+ Conceptual sequence:
```text
- browser_session_start({ url: "https://example.com" })
- browser_observe({ session: sessionId })
- browser_click({ session: sessionId, target: "@e4" })
- browser_observe({ session: sessionId })
- browser_session_stop({ session: sessionId })
+ browser_session({ action: "start", url: "https://example.com" })
+ browser_inspect({ action: "observe", session: sessionId })
+ browser_interact({ action: "click", session: sessionId, target: "@e4" })
+ browser_inspect({ action: "observe", session: sessionId })
+ browser_session({ action: "stop", session: sessionId })
```
- The plugin owns only sessions created by `browser_session_start`. `browser_session_list` reports
- only those owned sessions. Never guess or reuse a session id from another program. When `session`
- is omitted, most tools use the most recently started or used owned session; explicit ids are safer
- for multi-session work.
+ The plugin owns only sessions it starts. Never guess or reuse a session id from another program.
+ When `session` is omitted, most actions use the current owned session, but explicit ids are safer.
## Stop when the goal is met
- Browser work is a bounded task, not open-ended browsing.
+ Browser work is bounded. Define an observable success condition, take the shortest path, and stop
+ as soon as success is visible. Do not refresh or click after success. If an action fails twice
+ without progress, pause instead of brute-forcing. If state is ambiguous, make at most one fresh
+ observation and then ask the user.
- 1. Define one observable success condition from the user's request.
- 2. Take the shortest path: observe, act, then perform at most one relevant check.
- 3. Stop immediately when success is visible. Do not refresh, navigate, click, or perform extra
- verification after success.
- 4. If a human-only step appears, use `browser_request_help`. If an action fails twice without
- progress, pause instead of brute-forcing.
- 5. When uncertain, make at most one fresh observation. If the state is still ambiguous, ask the
- user rather than continuing to click.
+ ## Observe and interact
- ## Core interaction loop
+ Use `browser_inspect` with `action: "observe"` as the primary semantic page view. It returns roles,
+ states, text, and `@eN` refs. Use `action: "snapshot"` when a static accessibility tree is more useful.
+ Prefer a fresh ref over a raw CSS selector for interactions.
- Use `browser_navigate` to open a destination in the active Agent Window tab, then inspect the page
- before interacting:
+ Refs invalidate after navigation and may become stale after large DOM changes. Observe again after
+ navigation or a meaningful DOM update before using another ref. If an observation identifies a
+ hover-triggered surface, hover the trigger, observe again, then interact with the revealed control.
- 1. `browser_observe` is the primary semantic view. It returns roles, states, text, and `@eN` refs,
- including hints about conditional hover or focus surfaces.
- 2. `browser_snapshot` is the static accessibility-tree fallback when the semantic view is
- insufficient or a stricter tree is useful.
- 3. Prefer a fresh `@eN` ref over a raw CSS selector for `browser_click`, `browser_hover`,
- `browser_fill`, `browser_select`, and targeted `browser_press` calls.
- 4. Observe again after navigation or a meaningful DOM change before using another ref.
+ Use `browser_interact` as follows:
- Refs invalidate after navigation and may also become stale after large DOM changes. Never carry a
- ref to a new page. If an observation marks a control as hover-triggered, call `browser_hover` on the
- trigger, observe again, and then act on the newly visible ref.
+ - `action: "click"`: requires `target`; optionally accepts `button` and `clickCount`.
+ - `action: "hover"`: requires `target`; optionally accepts `modifiers`, `settleMs`, and `timeoutMs`.
+ - `action: "fill"`: requires `target` and `value`; `noClear` appends instead of replacing.
+ - `action: "select"`: requires `target` and a non-empty `values` array. Values are option value
+ attributes, not necessarily the visible labels.
+ - `action: "press"`: requires `key`; optionally focus `target` first and set `holdMs`.
- Use interaction tools according to their schemas:
+ ## Navigate and wait
- - `browser_click`: click a ref or selector; optionally choose mouse button and click count.
- - `browser_hover`: move to a ref or selector and allow hover UI to settle; then observe again.
- - `browser_fill`: clear and fill a text-capable element; set `noClear` only when appending is
- intentional.
- - `browser_select`: pass `values` as an array, including for a single option.
- - `browser_press`: send a key or combo, optionally focusing `target` first.
+ Use `browser_page` with these actions:
- Actions may trigger a navigation after the action itself returns. Use
- `browser_wait_for_navigation` only when that lifecycle wait is actually needed, then observe the
- new page.
+ - `navigate` requires `url` and optionally accepts `waitUntil` and `timeoutMs`.
+ - `back` and `forward` move one history entry and optionally accept lifecycle wait fields.
+ - `reload` refreshes the current tab; set `hard: true` only when bypassing cache is necessary.
+ - `wait` waits for an expected navigation after an interaction that did not already wait.
- ## Observation and page reading priority
+ Avoid speculative waits when no navigation is expected. After any page change, discard old refs and
+ observe again.
+ ## Reading priority
+
Escalate page reading only as needed:
- 1. `browser_observe` for normal semantic understanding and interaction refs.
- 2. `browser_snapshot` for a stricter static accessibility tree.
- 3. `browser_get_html` for hidden DOM, metadata, or exact markup that the semantic views cannot
- provide. A `ref` must come from a fresh observation; keep `maxBytes` bounded.
- 4. `browser_screenshot` for layout, styling, canvas, image content, or another genuinely visual
- question. Pass a fresh `ref` to crop to one element, or omit it for the visible tab.
+ 1. `browser_inspect` with `action: "observe"` for normal understanding and refs.
+ 2. The same tool with `action: "snapshot"` for a stricter static tree.
+ 3. `action: "html"` for exact markup that semantic views cannot provide; keep `maxBytes` bounded and
+ use only a fresh ref when scoping a subtree.
+ 4. `action: "screenshot"` for layout, styling, canvas, or genuinely visual evidence. A fresh `ref`
+ crops to an element; omit it for the visible tab.
- Do not start with raw HTML or a screenshot merely to discover ordinary controls. Screenshots may
- return an inline image or a saved path depending on the deployment.
+ Do not start with raw HTML or a screenshot merely to discover ordinary controls.
## Tabs and the Agent Window boundary
- Write actions normally affect only Agent Window tabs.
-
- - `browser_tab_list` lists `agent`, `user`, or `all` tabs visible to the owned session. Use
- `scope: "user"` to locate a user tab before borrowing it.
- - `browser_tab_create` creates an Agent Window tab. It is active by default; set `active: false`
- for a background tab.
- - `browser_tab_select` focuses an Agent Window tab.
- - `browser_tab_close` closes an Agent Window tab.
- - `browser_tab_borrow` moves a chosen user tab into the Agent Window before any write action.
- - `browser_tab_return` returns a borrowed tab to its original window and position. Return it as
- soon as the immediate task is finished; stopping the session is only the fallback cleanup.
-
- Use only a `tabId` returned by `browser_tab_list` or `browser_tab_create`. Do not assume a tab id
- from page position or title.
-
- ## Navigation and lifecycle
-
- - `browser_navigate` opens a URL and can wait for a requested lifecycle phase.
- - `browser_navigate_back` and `browser_navigate_forward` move one history entry.
- - `browser_reload` reloads the current tab; use `hard: true` only when bypassing cache is necessary.
- - `browser_wait_for_navigation` waits for a lifecycle event after an action that did not already
- wait. Avoid speculative waits when no navigation is expected.
-
- After navigation, history traversal, or reload, discard old refs and call `browser_observe` or
- `browser_snapshot` again.
-
- ## Ask the user for browser help
-
- Call `browser_request_help` for login, captcha, OTP, payment confirmation, consent, or another step
- that requires the user. Give a clear `prompt`; when the prompt refers to a concrete control, pass
- its fresh ref or selector in `targets` so the overlay can highlight it. Use `title` only when it
- adds clarity.
-
- Optional `completionCriteria` can finish the pause automatically when the page has an explicit,
- stable success signal. It supports `any` or `all` conditions using `urlContains`, `urlMatches`,
- `selectorExists`, `selectorMissing`, `textExists`, or `textMissing`, plus `stableForMs`.
-
- ```text
- browser_request_help({
- session: sessionId,
- title: "Sign in required",
- prompt: "Complete sign-in, then return control after the account page appears.",
- targets: ["@e7"],
- timeoutMs: 300000,
- completionCriteria: {
- any: [{ urlContains: "/account" }, { selectorExists: "[data-testid='account-menu']" }],
- stableForMs: 1000
- }
- })
- ```
-
- Interpret outcomes deliberately:
-
- - `continued` or `completed`: the user returned control or the explicit detector matched. Observe
- again before reasoning about the new state or using refs.
- - `cancelled`: stop the requested flow.
- - `timed_out`: report the timeout; do not repeatedly reopen the prompt.
- - `disabled`: unattended mode does not allow help; proceed only if safe or stop gracefully.
- - `navigated`: legacy outcome; do not treat navigation alone as proof of success.
-
- ## Debugging without page scripting
-
- Use the read-only debugging tools only when relevant to the user's task:
-
- - `browser_console` reads buffered console messages, browser logs, and JavaScript exceptions.
- Set `includeStack: true` when stack frames are useful.
- - `browser_network` reads buffered response and failure metadata. It does not return request or
- response headers or bodies and does not modify traffic.
-
- Both tools accept `tabId`, `since`, `limit`, and `maxTextChars`. Their result returns `nextSince`;
- pass that value as the next `since` cursor instead of repeatedly requesting the same entries.
-
- Arbitrary page script evaluation and interaction recording are intentionally unsupported in this
- DeepSeek Harness plugin. Do not invent tool names or route around this limitation. If the task
- strictly requires either capability, explain that it is not available in this phase.
-
- ## Window and device controls
-
- - `browser_window_resize` changes the Agent Window's outer `width` and `height`; each dimension
- must be from 100 through 7680 CSS pixels.
- - `browser_emulate` applies a built-in device preset or explicit viewport settings to the active
- tab. Explicit `width` and `height` must be supplied together. `mobile: true` also requires both
- dimensions. Use `off: true` alone to clear emulation. Emulation is per-tab and new tabs do not
- inherit it.
-
- ## Tool reference
-
- ### Sessions
-
- | Tool | Purpose |
- | --- | --- |
- | `browser_session_start` | Start an owned Agent Window session, optionally with URL, size, browser instance, focus behavior, or device preset. |
- | `browser_session_stop` | Stop an owned session and close its Agent Window. |
- | `browser_session_list` | List owned sessions and identify the current one. |
+ Use `browser_tabs` with these actions:
- ### Navigation and reading
+ - `list` returns visible tabs; `scope: "user"` finds a user tab before borrowing.
+ - `create` makes an Agent Window tab and optionally accepts `url`, `active`, and `index`.
+ - `select` focuses an Agent Window tab and requires a returned `tabId`.
+ - `close` closes an Agent Window tab and requires a returned `tabId`.
+ - `borrow` moves a user tab into the Agent Window and requires a listed user `tabId`.
+ - `return` restores a borrowed tab and requires that borrowed `tabId`.
- | Tool | Purpose |
- | --- | --- |
- | `browser_navigate` | Navigate the active tab to a URL. |
- | `browser_navigate_back` | Go back one history entry. |
- | `browser_navigate_forward` | Go forward one history entry. |
- | `browser_reload` | Reload the active tab, optionally bypassing cache. |
- | `browser_wait_for_navigation` | Wait for an expected page lifecycle event. |
- | `browser_observe` | Read the primary semantic page representation with refs. |
- | `browser_snapshot` | Read the static accessibility-tree fallback with refs. |
- | `browser_get_html` | Read raw document or ref-scoped HTML as a last resort. |
- | `browser_screenshot` | Capture the visible tab or a ref-cropped element. |
+ Return borrowed tabs as soon as the immediate task finishes. Stopping the session is only fallback
+ cleanup. Never invent a tab id.
- ### Interaction
+ ## Human help and display controls
- | Tool | Purpose |
- | --- | --- |
- | `browser_click` | Click a ref or CSS selector. |
- | `browser_hover` | Hover a ref or selector to reveal conditional UI. |
- | `browser_fill` | Fill a text-capable element. |
- | `browser_select` | Select one or more option values. |
- | `browser_press` | Send a keyboard key or combo. |
+ Use `browser_assist` with `action: "request-help"` for login, captcha, OTP, payment confirmation,
+ consent, or another human-only step. `prompt` is required. Optional `targets` highlight fresh refs or
+ selectors. `completionCriteria` can detect explicit stable success through URL, selector, or text
+ conditions. After the user continues or criteria complete, observe again before reasoning about the
+ new state.
- ### Tabs
+ Use `action: "resize"` with `width` and `height` to resize the outer Agent Window. Use
+ `action: "emulate"` with a device preset or explicit width and height; `mobile: true` also requires
+ dimensions. Use `off: true` alone to clear emulation. Emulation is per tab.
- | Tool | Purpose |
- | --- | --- |
- | `browser_tab_list` | List visible user and Agent Window tabs. |
- | `browser_tab_create` | Create an Agent Window tab. |
- | `browser_tab_select` | Focus an Agent Window tab. |
- | `browser_tab_close` | Close an Agent Window tab. |
- | `browser_tab_borrow` | Move a user tab into the Agent Window. |
- | `browser_tab_return` | Return a borrowed tab to its original window. |
+ ## Read-only diagnostics
- ### Assistance, diagnostics, and display
+ Use `browser_inspect` with `action: "console"` for buffered logs and exceptions, and
+ `action: "network"` for response and failure metadata. Both accept `tabId`, `since`, `limit`, and
+ `maxTextChars`; continue with the returned sequence cursor rather than rereading the same entries.
+ Console additionally accepts `includeStack`.
- | Tool | Purpose |
- | --- | --- |
- | `browser_request_help` | Pause for an explicit user browser step. |
- | `browser_console` | Read buffered console and exception entries. |
- | `browser_network` | Read buffered response and failure metadata. |
- | `browser_window_resize` | Resize the Agent Window. |
- | `browser_emulate` | Apply or clear per-tab device emulation. |
+ Arbitrary page script evaluation and interaction recording are intentionally unsupported. Do not
+ invent tool names or route around that limitation.
## Error handling and final checklist
- On a stale ref, observe again and retry once with a fresh ref. On a closed or unknown tab, list
- tabs instead of guessing. On an unknown session, list owned sessions or start a new one; never try
- foreign ids. On timeout, decide whether one longer, purposeful wait is justified. Avoid repeated
- actions with unchanged state.
-
- Before finishing a browser task, verify that:
+ On a stale ref, observe again and retry once. On an unknown tab, list tabs instead of guessing. On
+ an unknown session, list owned sessions or start one; never try foreign ids. On timeout, decide
+ whether one longer purposeful wait is justified, and never immediately repeat a failed history
+ action without first checking page state.
- - The user's observable goal is met, or the blocker is clearly reported.
- - Any borrowed tab has been returned when practical.
- - The owned session has been stopped unless the user explicitly asked to keep it open.
- - No further page action is taken after success.
+ Before finishing, verify that the observable goal is met or the blocker is clear, borrowed tabs are
+ returned when practical, the owned session is stopped, and no extra page action occurs after
+ success.