{
  "version": "0.1.6-beta",
  "commit": "a9eb4d1773249fe9c9530c0af583805af6e559b9",
  "build_date": "2026-09-13T21:18:13Z",
  "tool_schema": [
    {
      "name": "chrome.go_back",
      "description": "Navigate the browser back one step in history.",
      "params": [
        "wait_until"
      ],
      "required": null
    },
    {
      "name": "explorer.get_element_dependencies",
      "description": "Get dependencies for an element. Returns {element_id, outgoing, incoming}.",
      "params": [
        "element_id"
      ],
      "required": [
        "element_id"
      ]
    },
    {
      "name": "chrome.dialog",
      "description": "Arm how the NEXT browser dialog (alert/confirm/prompt) should be resolved. Call this BEFORE the action you expect to trigger a dialog (e.g. right before chrome.click on a button with a confirmation prompt) -- it applies to exactly one dialog and is then cleared. If a dialog opens with nothing armed, it is auto-dismissed and recorded in chrome.console_messages.",
      "params": [
        "action",
        "prompt_text"
      ],
      "required": [
        "action"
      ]
    },
    {
      "name": "explorer.get_exploration_queue",
      "description": "List queued exploration items ordered by priority. By default only pending (not yet completed) items are returned. Pass the strategy named in your task prompt (\"Strategy: ...\") to get results ordered accordingly. Returns {items, count}.",
      "params": [
        "limit",
        "include_completed",
        "strategy"
      ],
      "required": null
    },
    {
      "name": "explorer.register_elements",
      "description": "Bulk-register elements found on a page. Returns {element_ids, count}.",
      "params": [
        "page_id",
        "elements"
      ],
      "required": [
        "page_id",
        "elements"
      ]
    },
    {
      "name": "chrome.click",
      "description": "Click an element on the current page. selector accepts either a CSS selector or an \"aria-ref=\u003cref\u003e\" handle taken from a chrome.snapshot result -- prefer the handle whenever chrome.snapshot showed you the element, since it names exactly one node and never guesses. Never targets an \u003coption\u003e element directly (not possible in this tool -- use chrome.select_option).",
      "params": [
        "selector",
        "button",
        "click_count",
        "timeout_ms"
      ],
      "required": [
        "selector"
      ]
    },
    {
      "name": "chrome.press_key",
      "description": "Press a keyboard key. If selector is given, focuses the element first.",
      "params": [
        "key",
        "selector"
      ],
      "required": [
        "key"
      ]
    },
    {
      "name": "explorer.complete_queue_item",
      "description": "Mark a queued exploration item as done. Never deletes the row -- a completed item still exists and can be seen again via get_exploration_queue(include_completed=true). Returns {completed, queue_id}.",
      "params": [
        "queue_id",
        "note"
      ],
      "required": [
        "queue_id"
      ]
    },
    {
      "name": "explorer.get_action_history",
      "description": "Get action history. Returns {actions, count}.",
      "params": [
        "page_id",
        "element_id",
        "limit"
      ],
      "required": null
    },
    {
      "name": "chrome.snapshot",
      "description": "Return the accessibility tree of the current page as JSON. Hard cap: 5 MB (returns snapshot_too_large error if exceeded). If the result includes an untried_refs list, those are refs from THIS same result that you have not yet tried on this page — untried_count/tried_count cover the whole page (untried_refs itself may be truncated to the first 25). Treat it as your own catalogue telling you what is left, not an instruction to click in that order. If untried_refs is absent, no such catalogue is available for this snapshot — rely on your own judgment as before.",
      "params": [
        "interesting_only"
      ],
      "required": null
    },
    {
      "name": "explorer.queue_exploration",
      "description": "Add a page or element to the exploration queue. Repeating the same target (same element_id, or same target_url) while it is still pending updates that item instead of creating a duplicate. Returns {queue_id} — the same id every time for a repeated target. Always pass target_url when the item refers to a specific route/tab/modal, even if the discovery page is different — this is what keeps the backlog from filling up with restated copies of the same thing.",
      "params": [
        "target_url",
        "page_id",
        "reason",
        "element_id",
        "priority"
      ],
      "required": [
        "page_id",
        "reason"
      ]
    },
    {
      "name": "explorer.get_session_info",
      "description": "Get session info. Returns the active session row or a specific session by ID.",
      "params": [
        "session_id"
      ],
      "required": null
    },
    {
      "name": "explorer.get_app_context",
      "description": "Get the app context loaded from --app-context-path. Returns the context map or empty object.",
      "params": null,
      "required": null
    },
    {
      "name": "explorer.get_page_info",
      "description": "Get info about a page by URL or ID. Returns page row + element_count.",
      "params": [
        "page_url",
        "page_id"
      ],
      "required": null
    },
    {
      "name": "chrome.select_option",
      "description": "Select one or more options in a \u003cselect\u003e element by VALUE (never by clicking the \u003coption\u003e itself -- that is not possible in any browser-automation tool). selector accepts either a CSS selector or an \"aria-ref=\u003cref\u003e\" handle taken from a chrome.snapshot result.",
      "params": [
        "selector",
        "values",
        "timeout_ms"
      ],
      "required": [
        "selector",
        "values"
      ]
    },
    {
      "name": "explorer.update_page_description",
      "description": "Update the AI description of a page. Returns {updated, page_id}.",
      "params": [
        "page_id",
        "ai_description",
        "confidence"
      ],
      "required": [
        "page_id",
        "ai_description"
      ]
    },
    {
      "name": "explorer.record_action",
      "description": "Log an action taken on an element. Returns {action_id}.",
      "params": [
        "action_type",
        "input_value",
        "expected_result",
        "page_before_id",
        "actual_result",
        "page_after_id",
        "console_errors",
        "bug_detected",
        "element_id"
      ],
      "required": [
        "element_id",
        "action_type"
      ]
    },
    {
      "name": "explorer.get_visibility_changes",
      "description": "Get elements whose state changed from a previous visit. Returns {elements, count}.",
      "params": [
        "page_id"
      ],
      "required": null
    },
    {
      "name": "explorer.update_element_state",
      "description": "Update an element's state. Returns {updated, element_id}.",
      "params": [
        "element_id",
        "state",
        "explored",
        "ai_purpose",
        "confidence",
        "is_dynamic",
        "depends_on_data",
        "depends_on_elements"
      ],
      "required": [
        "element_id",
        "state"
      ]
    },
    {
      "name": "chrome.console_messages",
      "description": "Return buffered browser console messages (level, text, timestamp). Includes explicit console.*() calls, uncaught JS exceptions (level \"error\", text prefixed \"Uncaught \"), and failed network requests on document/xhr/fetch resources only (level \"clickprobe-network\", never a static sub-resource 404 -- that is not a bug). Buffer holds up to 1000 most recent messages. Each message carries is_new: true only if it arrived since YOUR last call to this tool (the buffer itself is never cleared unless you pass clear_after_read) -- check is_new, not just presence, to tell whether an error just happened or is an old one you already saw (e.g. a page-load error that will otherwise appear in every read for the rest of the session). new_since_previous_read gives the same answer as a count, for a quick check without scanning every entry.",
      "params": [
        "clear_after_read"
      ],
      "required": null
    },
    {
      "name": "explorer.get_unexplored_elements",
      "description": "List unexplored elements on a page — including elements the proxy registered for you from chrome.snapshot, not only ones you registered yourself. Ranked: enabled before disabled (a disabled control usually needs a prerequisite step first — e.g. selecting a row before a bulk-action button enables), then by how often you've been shown it. Capped at 25 — total_unexplored tells you if there are more. Returns {page_id, elements, count, total_unexplored}.",
      "params": [
        "page_id"
      ],
      "required": [
        "page_id"
      ]
    },
    {
      "name": "chrome.evaluate",
      "description": "Evaluate a JavaScript expression in the current page context and return the result. Hard cap: 5 s.",
      "params": [
        "expression"
      ],
      "required": [
        "expression"
      ]
    },
    {
      "name": "explorer.search_elements",
      "description": "Search elements by label or purpose. Returns {elements, count}.",
      "params": [
        "query",
        "element_type",
        "page_id"
      ],
      "required": [
        "query"
      ]
    },
    {
      "name": "chrome.wait_for",
      "description": "Wait for an element to reach the given state on the current page.",
      "params": [
        "selector",
        "state",
        "timeout_ms"
      ],
      "required": [
        "selector"
      ]
    },
    {
      "name": "chrome.navigate",
      "description": "Navigate the persistent browser page to `url`. Subsequent chrome.* calls (click, type, screenshot without url, etc.) operate on this page.",
      "params": [
        "wait_until",
        "url"
      ],
      "required": [
        "url"
      ]
    },
    {
      "name": "explorer.report_bug",
      "description": "File a bug. Returns {bug_id}. If this defect was already filed earlier in this project, the response also carries {duplicate_of, occurrence, note} — the report is still recorded, never dropped, as another occurrence of the earlier bug.",
      "params": [
        "bug_type",
        "severity",
        "description",
        "reproduction_steps",
        "action_id"
      ],
      "required": [
        "action_id",
        "bug_type",
        "severity",
        "description"
      ]
    },
    {
      "name": "explorer.get_known_bugs",
      "description": "List known bugs. Returns {bugs, count}.",
      "params": [
        "page_url",
        "confirmed_only"
      ],
      "required": null
    },
    {
      "name": "explorer.register_page",
      "description": "Record a newly discovered page. Returns {page_id, is_new}.",
      "params": [
        "data_persistence",
        "url",
        "title",
        "ai_description",
        "confidence",
        "url_type",
        "url_pattern"
      ],
      "required": [
        "url"
      ]
    },
    {
      "name": "explorer.record_element_dependency",
      "description": "Record a dependency between two elements. Returns {dependency_id}.",
      "params": [
        "source_element_id",
        "target_element_id",
        "dependency_type",
        "action_id",
        "ai_description"
      ],
      "required": [
        "source_element_id",
        "target_element_id",
        "dependency_type"
      ]
    },
    {
      "name": "chrome.take_screenshot",
      "description": "Take a PNG screenshot. If `url` is provided, navigates to that URL first (opens a fresh page). If `url` is omitted, screenshots the current persistent page (requires chrome.navigate first).",
      "params": [
        "url",
        "full_page"
      ],
      "required": null
    },
    {
      "name": "chrome.hover",
      "description": "Hover over an element on the current page. selector accepts either a CSS selector or an \"aria-ref=\u003cref\u003e\" handle taken from a chrome.snapshot result.",
      "params": [
        "timeout_ms",
        "selector"
      ],
      "required": [
        "selector"
      ]
    },
    {
      "name": "chrome.type",
      "description": "Type text into an element. Uses Fill (instant) by default; set delay_ms for keystroke simulation. selector accepts either a CSS selector or an \"aria-ref=\u003cref\u003e\" handle taken from a chrome.snapshot result.",
      "params": [
        "timeout_ms",
        "selector",
        "text",
        "delay_ms",
        "clear_first"
      ],
      "required": [
        "selector",
        "text"
      ]
    }
  ]
}
